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

fre*_*low 9 c++ complexity-theory equality set unordered-set

给定两个std::sets,可以简单地同时迭代两个集合并比较元素,从而产生线性复杂性.这不适用于std::unordered_sets,因为元素可以按任何顺序存储.因此,如何昂贵的是a == bstd::unordered_set

Emi*_*lia 10

最坏的情况是O(n²).

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

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

通常,如果散列函数是"好"(不同的对象 - >总是不同的散列),则复杂性倾向于O(n),如果散列函数是"坏"(一切总是具有相同的散列值),则复杂性倾向于O(n²)

  • "散列函数很好(不同的对象 - >总是不同的散列)" - >即使对于糟糕的散列算法,也可以使用不同的散列(例如,通过返回从中克隆的8*128位散列值,最多128个字符的散列字符串字符串),但mod到桶的数量和结果是丑陋的.如果没有对促进冲突避免的输入有特殊的了解,那么修改后的良好散列函数通常会在使用与未使用的桶的比率上发生冲突...这仍然会导致O(n)平均值. (3认同)

Ano*_*ous 5

operator==和 的复杂度operator!=

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

标准第 23.2.5 条第 11 点中的更多详细信息:

对于unordered_setand unordered_map,其复杂度operator==(即调用 的==运算符、调用value_type返回的谓词 key_equal()以及调用返回的散列器的次数hash_function()N在平均情况下与 N 2成正比,在最坏情况下,其中Na.size().