在无序集上执行set_difference

时间:2014-03-28 10:34:17

标签: c++ stl

set_difference算法需要以下

  

范围内的元素必须按照同样的标准进行排序

哈希表不是这种情况。

我正在考虑用std::remove_copy来实现集合差异A-B,其中删除标准将是集合B中A元素的存在。

有没有一种标准有效,最快最安全的方法吗?

2 个答案:

答案 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进行排序(首先将其排序,我的意思是将其移动到已排序的集合中),从而获得任何收益。