通过std :: set迭代的复杂性

时间:2015-07-15 07:39:37

标签: c++ stl iterator set

我知道迭代整个集合的时间复杂度需要O(n)时间,其中n是集合的大小。 问题是,在两个迭代器itBeginitEnd之间迭代的复杂性是什么?也许它就像O(itEnd - itBegin + log n),但我无法证明。

2 个答案:

答案 0 :(得分:0)

复杂性将是o(n)(n的小o)而不是O(n),这意味着在最坏的情况下,你将迭代整个集合。

答案 1 :(得分:0)

迭代整个std::set的算法复杂度是O(n)。但是时间消耗大于迭代std::vector,因为向量使用单个内存块。

如果要在2个迭代器itBeginitEnd之间进行迭代,它也将是O(n1),但n1将类似于std::distance(itEnd, itBegin),这样会更少在第一种情况下比n。当你已经拥有迭代器时就是这种情况。

如果你想在迭代之前按值找到那些位置(你在开始时没有迭代器) - 这变成O(log n) + O(n2),实际上是O(log n)。比如说,如果你想从值123迭代到结尾 - 这将O(log n)找到迭代到123O(n2)迭代。