标准::unordered_multiset插入的复杂性
Complexity of std::unordered_multiset insert
为什么插入std::unordered_multiset
的最坏情况复杂度是线性的?我理解为什么std::unordered_set
是这种情况(您必须检查插入的值是否不在集合中),但对于多集我不明白。我错过了一些明显的东西吗?
std::unordered_multiset::insert()
的最坏情况复杂度是线性的,因为:
- 支持
- 非唯一键的无序关联容器称为支持等效键。 迭代这些容器时,具有等效键的元素在迭代中彼此相邻,形成等效键组。
- 迭代器函数需要恒定的摊销时间。
例如,考虑将 5
、13
和 13
插入到具有4
存储桶的unordered_multiset
中,并且unordered_multiset::key_eq(5, 13)
返回false
的情况。 在这种情况下,unordered_multiset::hash_function(5)
为 5
和 13
返回不同的哈希代码。 尽管具有不同的哈希代码,但这些元素仍可能插入到同一存储桶中。 如果整数的哈希函数返回整数本身,并且存储桶索引是哈希代码模数的结果,则
- 元素
5
被散列到5
,并且使用4
桶,它被放置在桶1
中。 - 元素
13
被散列到13
,并且通过4
桶,它也被放入桶1
中。
虽然unordered_set::insert()
检查以防止插入过程中出现重复项,但unordered_multiset::insert()
标识在何处插入元素以进行等效键分组。 在最坏的情况下,存储桶在插入最终13
时包含[5, 13]
,并且在迭代所有元素时,存储桶包含[5, 13, 13]
。 当对所有元素进行迭代时,复杂性在size()
中是线性的。
值得注意的是,在unordered_multiset::insert()
期间可能会发生重新散列,并且unordered_multiset::rehash()
被指定为具有复杂度,平均情况为线性size()
,最坏情况是二次的。 在重新哈希期间,原始哈希表中的所有元素都将迭代并插入到新的哈希表中。 由于迭代在size()
中具有线性复杂度,并且如上所述,每个插入在size()
中都有一个更差情况线性,因此得到的最坏情况是O(size()*size())
。
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 预处理器:插入结构名称中的前一个行号
- 在未初始化映射的情况下,将值插入到映射的映射中
- 如何在c++中只将键插入到bimap的一侧
- 如何将结构插入到集合中并打印集合的成员
- C++json插入数组
- Visual Studio 2019:插入多个C++风格的单行注释
- nlohmann-json将一个数组插入到另一个数组中
- 有效地使用std::unordered_map来插入或增加键的值
- 具有未知值时的时间复杂性
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 在使用链接列表实施队列时,为什么插入复杂性o(1)
- 此插入方法的时间和空间复杂性
- 提高插入排序的运行时复杂性
- 集合的复杂性::插入
- 将排序范围插入关联容器的复杂性
- map/set :: 插入是否提供了正确的迭代器提示,它的复杂性是多少?
- 将N个项插入到空std::映射的复杂性
- 标准::unordered_multiset插入的复杂性