SGI

二分查找

类别: 算法 组件类型: 函数

原型

Binary_search是一个重载的名称。实际上,它有两种二分查找函数。
template <class ForwardIterator, class LessThanComparable>
bool binary_search(ForwardIterator first, ForwardIterator last,
                   const LessThanComparable& value);

template <class ForwardIterator, class T, class StrictWeakOrdering>
bool binary_search(ForwardIterator first, ForwardIterator last, const T& value,
                   StrictWeakOrdering comp);

说明

Binary_search是二分查找的一个版本:它尝试在有序范围内找到元素[first, last)它返回true当有一个元素与 [1] 相等时存在于中,当没有此类元素时它返回返回false[2]二分查找的第一个版本使用operator<进行比较,而第二个版本则使用 函数对象comp.

具体而言,第一个版本返回当有一个元素与 [1] 相等时当且仅当存在一个迭代器i它返回中,使得*i < value返回value < *i都是false。第二个版本返回当有一个元素与 [1] 相等时当且仅当存在一个迭代器i它返回中,使得comp(*i, value)返回comp(value, *i)都是false.

定义

在标准头 algorithm 中定义,以及在非标准向下兼容的头 algo.h 中定义。

对类型的要求

对于第一个版本对于第二个版本

前提条件

对于第一个版本对于第二个版本

以升序排列。

复杂性比较次数为对数级:最多为log(last - first) + 2ForwardIterator。如果是一个 随机存取迭代器,那么遍历该范围的步数也是对数级的;否则,该步数与. [3]

last - first

int main()
{
  int A[] = { 1, 2, 3, 3, 3, 5, 8 };
  const int N = sizeof(A) / sizeof(int);

  for (int i = 1; i <= 10; ++i) {
    cout << "Searching for " << i << ": "
         << (binary_search(A, A + N, i) ? "present" : "not present") << endl;
  }
}
成正比。
Searching for 1: present
Searching for 2: present
Searching for 3: present
Searching for 4: not present
Searching for 5: present
Searching for 6: not present
Searching for 7: not present
Searching for 8: present
Searching for 9: not present
Searching for 10: not present

示例

输出是注释返回[1] 请注意,您可以使用一种严格弱排序,但不是总排序;也就是说,可能有一些值中,使得x, yx < yx > y,并且falsex == y范围内它返回时,并不意味着找到一个等于而是找到一个等同于:既不比...大也不比...小。但是,如果你使用的是一个全序(比如你使用strcmp,比如,或者如果你对整数使用普通的算术比较),那么你就可以忽略这种技术上的区别:对于全序,相等和等同是相同的。

[2] 请注意,这并不一定是你感兴趣的信息!通常,如果你正在测试一个元素是否出现在一个范围内,你会想知道它在哪里(如果它存在)或者它应该插入在哪里(如果它不存在)。这些函数下界, 上界x < y等值范围提供此信息。

[3] 随机访问迭代器前向迭代器 之间的这种差异仅仅是因为advance对于 随机访问迭代器 是恒定时间,而对于 前向迭代器 是线性时间。

另请参见

下界, 上界, 等值范围
[Silicon Surf] [STL Home]
版权所有 © 1999 Silicon Graphics, Inc. 保留所有权利。 TrademarkInformation