【发布时间】:2010-09-18 08:52:44
【问题描述】:
我想知道 STL 多重集、映射和哈希映射类的 Big O 表示法在以下情况下的复杂性:
- 插入条目
- 访问条目
- 检索条目
- 比较条目
【问题讨论】:
-
这实际上是我的帖子,我不明白为什么我看起来不活跃,因此无法更改它...
标签: c++ complexity-theory big-o
我想知道 STL 多重集、映射和哈希映射类的 Big O 表示法在以下情况下的复杂性:
【问题讨论】:
标签: c++ complexity-theory big-o
这些是使用red-black tree 实现的,balanced binary search tree 的类型。它们具有以下渐近运行时间:
插入:O(log n)
查找:O(log n)
删除:O(log n)
这些是使用hash tables 实现的。它们具有以下运行时:
插入:O(1) 预期,O(n) 最坏情况
查找:O(1) 预期,O(n) 最坏情况
删除:O(1) 预期,O(n) 最坏情况
如果您使用适当的散列函数,您几乎永远不会看到最坏的情况,但请牢记这一点 - 请参阅 Crosby 和 Wallach 的 Denial of Service via Algorithmic Complexity Attacks 示例。
【讨论】:
hash_* 上所说的都是指C++11 无序和Boost.Unordered 容器吗?
hash_* 类模板是Silicon Graphics STL 的一部分。这些已以unordered_* 名称(unordered_map、unordered_set 等)并入 C++11 修订版。此外,它们已包含在 libstdc++、Visual C++ 和 Boost C++ 库中。
对于set、multiset、map、multimap,插入、删除和检索信息的时间复杂度为O(logn),因为它们遵循平衡二叉树来构造数据。
对于unordered_set和unordered_map,使用hashing方法来构造数据。所以这个时间复杂度是O(1)。这是对信息执行任何操作的完美方式,以防您的先决条件是没有按排序顺序排列的数据。
【讨论】: