【发布时间】:2015-10-04 03:09:40
【问题描述】:
我知道迭代整个集合的时间复杂度需要O(n) 时间,其中n 是集合的大小。
问题是,在两个迭代器itBegin 和itEnd 之间进行迭代的复杂度是多少?也许它类似于O(itEnd - itBegin + log n),但我无法证明这一点。
【问题讨论】:
-
仍然是 O(n),其中 n 是迭代器之间的距离。我建议您重新阅读渐近复杂度的定义。
-
我认为你错了。例如,如果
itEnd = itBegin + 1,那么复杂度将为O(log n),但不是O(1)。 -
“例如,如果 itEnd = itBegin + 1,那么复杂度将为 O(log n) 而不是 O(1)” - 你不能推导出 big-O仅从 n=1 的情况来看的复杂性......它是关于当 n 接近无穷大时所需的计算如何变化。
-
n=1并非如此。itBegin不是s.begin()和itEnd不是s.end() -
好吧...退后一步,“也许它类似于 O(itEnd - itBegin + log n),但我无法证明。” - 不- 就是
O(itEnd - itBegin)。如果您知道itEnd - itBegin平均与n线性相关,您可以将其简化为 O(n)。 MikeMB 所说的是“O(n),其中 n 是迭代器之间的距离”——即itEnd - itBegin。对于itEnd = itBegin + 1的反例 - 在 C++ 中,将 1 添加到迭代器意味着下一个元素:它们相隔 1 并且使用 MikeMB 对n的定义作为“迭代器之间的距离”,它确实是 n=1正如我所说的那样。