【发布时间】:2012-07-31 13:34:49
【问题描述】:
遍历std::set/std::multiset/std::map/std::multimap 的时间复杂度是多少?我相信它在集合/地图的大小上是线性的,但不太确定。语言标准中有规定吗?
【问题讨论】:
-
整个容器的迭代总是
O(n)至少(我想真的很愚蠢的实现可能会使它更糟)
标签: c++ stl time-complexity big-o std
遍历std::set/std::multiset/std::map/std::multimap 的时间复杂度是多少?我相信它在集合/地图的大小上是线性的,但不太确定。语言标准中有规定吗?
【问题讨论】:
O(n)至少(我想真的很愚蠢的实现可能会使它更糟)
标签: c++ stl time-complexity big-o std
在draft C++11 standard N3337 中可以在第 24.2.1 节第 8 段中找到答案:
所有类别的迭代器只需要那些函数 可在恒定时间内实现给定类别(摊销)。
由于对迭代器的每个操作都必须是常数时间,因此遍历n 元素必须是O(n)。
【讨论】:
std::set、std::multiset、std::map、std::multimap,如果实现为红黑树(这是最常见的情况),最坏情况复杂度为查找下一个/上一个有序元素是O(log N)。当然,在实践中,平均情况是摊销常数。
我相信它在集合/地图的大小上是线性的,但不是这样 当然。
没错。遍历整个集合或地图是O(N)
【讨论】:
O(N)。证明很简单。容器set 和map 使用红黑树实现。每次从一个节点移动到另一个节点时,只需在两个节点之间画一条线。完成迭代后,您会看到所有行都翻了一番,并且您访问了每个节点恰好两次。
2n 时间,所以 O(n)。我也意识到我对你如何找到元素的描述是错误的。你帮助了我——我一直以为是O(n*log(n))。谢谢!