unordered set intersection in C++
Asymptotically, your algorithm is as good as it can get.
In practice, I'd add a check to loop over the smaller of the two sets and do lookups in the larger one. Assuming reasonably evenly distributed hashes, a lookup in a std::unoredered_set
takes constant time. So this way, you'll be performing fewer such lookups.
You can do it with std::copy_if()
std::copy_if(a.begin(), a.end(), std::inserter(c, c.begin()), [b](const int element){return b.count(element) > 0;} );
Your algorithm is as good as it gets for a unordered set. however if you use a std::set
(which uses a binary tree as storage) or even better a sorted std::vector
, you can do better. The algorithm should be something like:
- get iterators to
a.begin()
andb.begin()
- if the iterators point to equal element add to intersection and increment both iterators.
- Otherwise increment the iterator pointing to the smallest value
- Go to 2.
Both should be O(n) time but using a normal set should save you from calculating hashes or any performance degradation that arises from hash collisions.