【问题标题】:Time complexity of iterating through a C++ unordered_map [duplicate]遍历 C++ unordered_map 的时间复杂度 [重复]
【发布时间】:2014-10-01 10:41:36
【问题描述】:

我知道 C++ STL 中的 unordered_map 是作为哈希表实现的,该哈希表由对应于哈希值的存储桶组成。插入、删除和元素搜索的时间保证是摊销常数。但是我不太明白迭代器是如何在这个数据结构上工作的。当我增加迭代器时,它如何知道下一个位置在哪里?当我使用迭代器迭代 unordered_map 时,时间复杂度是多少?时间是否用于查找迭代器常量的下一个位置?我在 The C++ Standard Library: A tutorial and Reference 一书中找到了一些关于 unordered_map 内部结构的信息,但我找不到我的问题的答案。希望有人能帮忙!

谢谢。

【问题讨论】:

  • 这篇文章 (stackoverflow.com/questions/19610457/…) 说任何标准容器都必须提供 O(1) 迭代器。 (我建议删除这个问题,除非它实际上与链接的问题不同)。
  • 从 cmets 之一“C++ 标准的第 24.4.4 节”中提取此内容,给出了对前向迭代器的 ++ 运算符的要求。好问题。我很享受这次旅行。 :)
  • @sam 如果这是一个“好”的问题,那么就没有理由删除它!标记为重复(如果适用)。
  • @sam 感谢您的链接!

标签: c++ stl unordered-map


【解决方案1】:

哈希表是使用包含链表的桶来实现的。所以迭代很容易:

  1. 查看当前节点是否有next指针。如果是这样,那就去吧。
  2. 如果当前节点没有next指针,则转到下一个有节点的bucket。
  3. 如果没有这样的节点,那么您就完成了迭代。

(通过找到第一个包含节点的桶来找到第一个节点。)

直观地说,由于使用上述算法遍历整个哈希表是 O(n),看起来每个“下一个”操作都是摊销的常数时间。

【讨论】:

  • 这是我正在寻找的答案。谢谢!
  • 不完全是 O(n),而是 O(N+n),其中 N 是桶的数量。这是因为每个桶至少需要访问一次,即使它没有元素。这些通常是彼此远离的常数因素,这就是为什么这很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 2022-07-01
  • 2013-03-06
  • 2013-11-05
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
相关资源
最近更新 更多