【问题标题】:multiset, map and hash map complexity多重集、映射和哈希映射复杂度
【发布时间】:2010-09-18 08:52:44
【问题描述】:

我想知道 STL 多重集、映射和哈希映射类的 Big O 表示法在以下情况下的复杂性:

  • 插入条目
  • 访问条目
  • 检索条目
  • 比较条目

【问题讨论】:

  • 这实际上是我的帖子,我不明白为什么我看起来不活跃,因此无法更改它...

标签: c++ complexity-theory big-o


【解决方案1】:

map、set、multimap 和 multiset

这些是使用red-black tree 实现的,balanced binary search tree 的类型。它们具有以下渐近运行时间:

插入:O(log n)
查找:O(log n)
删除:O(log n)

hash_map、hash_set、hash_multimap 和 hash_multiset

这些是使用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++ 库中。
  • @CEOatApartico:修复了死链接
  • 我不明白“预期的 O 和最坏情况的 O”。根据定义,Big-O 是“最坏情况”。
  • @PauliusLiekis 你不知道你在说什么。根据定义,Big-O 是“上限”,与最坏情况无关,平均。情况,最好的情况。
【解决方案2】:

对于setmultisetma​​pmultimap,插入、删除和检索信息的时间复杂度为O(logn),因为它们遵循平衡二叉树来构造数据。

对于unordered_setunordered_map,使用hashing方法来构造数据。所以这个时间复杂度是O(1)。这是对信息执行任何操作的完美方式,以防您的先决条件是没有按排序顺序排列的数据。

【讨论】:

    猜你喜欢
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 2018-10-13
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    相关资源
    最近更新 更多