set_difference算法需要以下
范围内的元素必须按照同样的标准进行排序
哈希表不是这种情况。
我正在考虑用std::remove_copy
来实现集合差异A-B,其中删除标准将是集合B中A元素的存在。
有没有一种标准有效,最快最安全的方法吗?
答案 0 :(得分:5)
如果你有两个哈希表,最有效的方法应该是迭代其中一个哈希表,查找另一个哈希表中的每个元素。然后将您没有找到的那些插入第三个容器中。粗略的草图可能如下所示:
std::vector<int> result;
std::copy_if(lhs.begin(), lhs.end(), std::back_inserter(result),
[&rhs] (int needle) { return rhs.find(needle) == rhs.end(); });
答案 1 :(得分:2)
如果你有两个长度为Na和Nb的无序集合A和B,并且你想做一个集合差异,即得到A的所有元素不在B中,那么因为B中的查找是恒定时间,你的简单地迭代A并检查它是否在B中的复杂性是O(Na)。
如果A是无序集合而B是集合(或排序向量等),则每次查找都是log(Nb),因此完全复杂度为O(Na * log(Nb))
排序第一个将使它(Na * log(Na))排序然后Na + Nb进行合并。如果Na明显小于Nb,则无论如何Na * log(Nb)明显小于Na + Nb,如果Na向Nb变大,那么首先对它进行排序不会更快。
因此,我认为首先对A进行排序(首先将其排序,我的意思是将其移动到已排序的集合中),从而获得任何收益。