我正在http://www.cplusplus.com/reference/algorithm/upper_bound/学习std::upper_bound
我发现这可能会在非随机访问迭代器上以线性时间运行。
我需要将它用于有序矢量。现在我不知道什么是非随机访问迭代器,以及它是否会在排序向量的对数时间内运行。
任何人都可以为我清楚这一点。
答案 0 :(得分:3)
§23.3.6.1[vector.overview] / p1:
vector是一个支持随机访问迭代器的序列容器。
random access iterator是一个能够在一个恒定时间内计算任意元素的偏移量的,而不需要从一个地方迭代到另一个地方(这将导致线性复杂性)。
std::lower_bound
本身提供了二进制搜索算法的通用实现,它并不关心迭代器用于指示范围(它只需要迭代器至少为forward类别)。它使用诸如std::advance
之类的辅助函数来迭代地限制其二进制搜索中的范围。对于随机访问类别 的std::vector<T>::iterator
,std::lower_bound
以对数时间复杂度运行,关于迭代元素所需的步骤数,因为它可以对范围进行分区在恒定时间内每一步减半。
§25.4.3[alg.binary.search] / p1:
本节中的所有算法都是二进制搜索的版本,并假设序列为 search是针对通过将搜索关键字绑定到参数而形成的表达式进行分区的 隐含或显式比较功能。他们使用非随机访问迭代器来最小化 比较次数,对于所有类型的迭代器都是对数的。 他们特别合适 对于随机访问迭代器,因为这些算法在数据中执行对数步骤 结构体。对于非随机访问迭代器,它们执行线性步数。