我不明白为什么它不是线性的。
关于multiset的类似问题有一个很好的答案: why hastable's rehash complexity may be quadratic in worst case
但是怎么样?每个键只能有一个元素。
更新
一个桶中的许多键也不是问题。我们可以在线性时间内完成它们。
我认为下面提到的正确答案是标准中包含的O(n ^ 2)重复复杂性允许开放地址(可能是其他一些)实现。
答案 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²)
可能是最坏的情况,即使有实现具有更好的渐近运行时。