为什么unorded_set rehash复杂度在最坏的情况下可能是O(n ^ 2)?

时间:2014-06-10 09:57:59

标签: c++ stl

我不明白为什么它不是线性的。

关于multiset的类似问题有一个很好的答案: why hastable's rehash complexity may be quadratic in worst case

但是怎么样?每个键只能有一个元素。

更新

一个桶中的许多键也不是问题。我们可以在线性时间内完成它们。

我认为下面提到的正确答案是标准中包含的O(n ^ 2)重复复杂性允许开放地址(可能是其他一些)实现。

1 个答案:

答案 0 :(得分:3)

基本上,可以构建一个具有O(n)最坏情况重传时间的哈希集。甚至可以使用此属性构建 multiset ,该属性仍然可以保证具有相同键的元素在存储桶中彼此相继,因此您声明的链接错误< / strong>即可。 (嗯,并非完全错误,它承认可能有O(n)个实施)

它的工作原理如下:

for each bucket b of old table
    for each element e in bucket b
        b' = new bucket of e
        prepend e before the first entry in b' // <---- this is the key optimization

该算法适用于集合和多集合,非常简单。我们不会将元素附加到新存储桶(可能是O(number of elements in the bucket)),而是添加到O(1)的存储区(只需更改两个指针)。

当然,这将颠倒存储桶中的元素。但这是可以的,因为关键的多重图假设相等的元素仍然存在。

但要注意开放式寻址

我的解决方案仅适用于链接哈希。它不适用于开放式寻址。因此,由于规范肯定希望允许两种实现方法,它必须声明O(n²)可能是最坏的情况,即使有实现具有更好的渐近运行时。