给定两个std::set
,可以简单地同时迭代两个集合并比较元素,从而产生线性复杂性。这对std::unordered_set
不起作用,因为元素可以按任何顺序存储。那么a == b
的{{1}}有多贵?
答案 0 :(得分:10)
最糟糕的情况是O(n²)。
但是无序集实际上是通过哈希来排序的。 因此可以比较哈希值(如果失败,则集合不能相等),然后验证相同的哈希值(线性)是否具有相同的值(对于具有相同哈希值的不同值的O(n²))。
在最好的情况下,这是O(n)。
通常,如果散列函数是“好”(不同的对象 - >总是不同的散列),则复杂性倾向于O(n),如果散列函数是“坏”,则复杂性倾向于O(n²)(一切都始终相同)哈希值)
答案 1 :(得分:3)
operator==
和operator!=
的复杂性:
平均情况下的线性复杂性。在最坏的情况下,N 2 ,其中N是容器的大小。
标准§23.2.5中的更多细节,第11点:
对于unordered_set
和unordered_map
,operator==
的复杂性(即==
value_type
运算符对谓词的调用次数归来的
key_equal()
以及hash_function()
返回的哈希值)在平均情况下与N
成比例,在最坏的情况下与N 2 成正比,其中{{1}是} N
。