比较两个无序集合的平等有多贵?

时间:2012-04-12 06:33:01

标签: c++ set complexity-theory equality unordered-set

给定两个std::set,可以简单地同时迭代两个集合并比较元素,从而产生线性复杂性。这对std::unordered_set不起作用,因为元素可以按任何顺序存储。那么a == b的{​​{1}}有多贵?

2 个答案:

答案 0 :(得分:10)

最糟糕的情况是O(n²)。

但是无序集实际上是通过哈希来排序的。 因此可以比较哈希值(如果失败,则集合不能相等),然后验证相同的哈希值(线性)是否具有相同的值(对于具有相同哈希值的不同值的O(n²))。

在最好的情况下,这是O(n)。

通常,如果散列函数是“好”(不同的对象 - >总是不同的散列),则复杂性倾向于O(n),如果散列函数是“坏”,则复杂性倾向于O(n²)(一切都始终相同)哈希值)

答案 1 :(得分:3)

operator==operator!=的复杂性:

平均情况下的线性复杂性。在最坏的情况下,N 2 ,其中N是容器的大小。

标准§23.2.5中的更多细节,第11点:

对于unordered_setunordered_mapoperator==的复杂性(即== value_type运算符对谓词的调用次数归来的 key_equal()以及hash_function()返回的哈希值)在平均情况下与N成比例,在最坏的情况下与N 2 成正比,其中{{1}是} N