的set_difference算法执行set_difference需要在范围以下上无序集合
各单元必须已经根据该相同标准
这对于哈希表的情况下进行排序。
我想实现在std::remove_copy
方面设定的差AB在去除标准将在集合B
的A的元素的存在,有没有一个标准,有效的,最快的,最安全的如何做到这一点?
的set_difference算法执行set_difference需要在范围以下上无序集合
各单元必须已经根据该相同标准
这对于哈希表的情况下进行排序。
我想实现在std::remove_copy
方面设定的差AB在去除标准将在集合B
的A的元素的存在,有没有一个标准,有效的,最快的,最安全的如何做到这一点?
如果您有两个哈希表,最有效的方法应该是迭代其中一个哈希表,查找另一个哈希表中的每个元素。然后将你没有找到的那些插入到第三个容器中。草图可能是这样的:
std::vector<int> result;
std::copy_if(lhs.begin(), lhs.end(), std::back_inserter(result),
[&rhs] (int needle) { return rhs.find(needle) == rhs.end(); });
我更喜欢rhs.count(针)== 0; 然而,我对你的答案的主要批评是你刚刚给你的算法的代码,但没有说明你为什么认为它是最快的可用方法。 – CashCow
如果你有2个无序集合A和长度Na和Nb的B和你想要做一组差,即得到的不是所有的元素B,则因为B中的查找是恒定的时间,所以简单地迭代A并检查它是否在B中的复杂度是O(Na)。
如果A是一组无序和B是一组(或有序矢量等),然后每个查找将日志(NB),以便全部复杂性将是O(NA *日志(NB))
排序首先使它(Na * log(Na))排序,然后Na + Nb进行合并。如果Na显着小于Nb,则Na * log(Nb)显然小于Na + Nb,并且如果Na越来越大于Nb,那么首先进行分选并不会更快。
因此,我认为你排序第一(通过首先排序,我的意思是将它移动到一个排序的集合)没有得到什么。
使用临时std :: set对象并将哈希表数据插入到std :: set对象中可能会更快(我相信它更安全)。然后调用set_difference()并将结果输出回散列表。我是确保事情先行工作的支持者,然后在必要时进行优化。 – PaulMcKenzie
那么,如果你真的想做一个临时副本,使用std :: vector和std :: sort,而不是std :: set。它会(更多!)更快,更高效地存储内存。 – ltjax