排序向量上std :: lower_bound的时间复杂度

时间:2015-08-16 10:36:44

标签: c++ c++11 vector iterator lower-bound

我正在http://www.cplusplus.com/reference/algorithm/upper_bound/学习std::upper_bound 我发现这可能会在非随机访问迭代器上以线性时间运行。

我需要将它用于有序矢量。现在我不知道什么是非随机访问迭代器,以及它是否会在排序向量的对数时间内运行。

任何人都可以为我清楚这一点。

1 个答案:

答案 0 :(得分:3)

§23.3.6.1[vector.overview] / p1:

  

vector是一个支持随机访问迭代器的序列容器。

random access iterator是一个能够在一个恒定时间内计算任意元素的偏移量的,而不需要从一个地方迭代到另一个地方(这将导致线性复杂性)。

std::lower_bound本身提供了二进制搜索算法的通用实现,它并不关心迭代器用于指示范围(它只需要迭代器至少为forward类别)。它使用诸如std::advance之类的辅助函数来迭代地限制其二进制搜索中的范围。对于随机访问类别 std::vector<T>::iteratorstd::lower_bound以对数时间复杂度运行,关于迭代元素所需的步骤数,因为它可以对范围进行分区在恒定时间内每一步减半。

§25.4.3[alg.binary.search] / p1:

  

本节中的所有算法都是二进制搜索的版本,并假设序列为   search是针对通过将搜索关键字绑定到参数而形成的表达式进行分区的   隐含或显式比较功能。他们使用非随机访问迭代器来最小化   比较次数,对于所有类型的迭代器都是对数的。 他们特别合适   对于随机访问迭代器,因为这些算法在数据中执行对数步骤   结构体。对于非随机访问迭代器,它们执行线性步数。