为什么在最坏的情况下unorder_set重哈希复杂度可能是O(n^2)
Why unorded_set rehash complexity could be O(n^2) in worst case?
我不明白为什么它不是线性的。
对于multiset的类似问题有一个很好的答案:为什么hastable's的重哈希复杂度在最坏情况下可能是二次的
但是set呢?每个键只能有一个元素。
更新:
一个桶中有多个键也不是问题。我们可以在线性时间内遍历它们
我认为下面提到的正确答案是O(n^2)重新哈希复杂度包含在标准中,以允许开放寻址(可能是其他一些)实现。
基本上,可以构建具有O(n)
最坏情况重散列时间的散列集。甚至可以用这个属性构建一个multiset,它仍然授予相同的保证,即具有相同键的元素在bucket中彼此后面,因此您所声明的链接是错误的。(好吧,不是完全错误,它承认可能存在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)
(简单地改变两个指针)。
当然,这将反转桶中的元素。但这是可以的,因为关键的multimap假设相等的元素在彼此后面仍然成立。
但要注意开放寻址
我的解决方案只适用于哈希链。它不适用于开放寻址。因此,由于规范肯定希望允许两种实现方法,因此必须声明O(n²)
可能是最坏的情况,即使存在具有更好的渐近运行时的实现。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 函数复杂度分析
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 使用Qt C++计算类似Git的SHA1哈希
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 用C++将哈希表写入文件并从文件中恢复
- c++找不到具有相同哈希的无序集合元素
- 哈希文件递归并保存到矢量Cryptopp中
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 函数的时间复杂度是多少?
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 如何计算此排序函数的时间复杂度?
- 哈希表中搜索函数的平均复杂度
- 链式哈希表的时间复杂度是多少?
- 为什么在最坏的情况下unorder_set重哈希复杂度可能是O(n^2)
- 在哈希表中创建字符串哈希值的时间复杂度
- 哈希表键与值获取复杂度