C++ STL 中的二分查找函数(binary_search、lower_bound 和 upper_bound)


二分查找是一种搜索算法,它通过将元素与数组的中值进行比较并将数组进行划分来搜索元素。该算法会重复执行此操作,直到找到该元素。

为了对数组应用二分查找,数组必须已排序。

二分查找的时间复杂度为**对数**阶。因此,程序员除了了解二分查找的实现外,还必须了解与二分查找相关的速记方法,以减少编写该算法代码的时间。本文将讨论标准模板库 (STL) 中包含的与二分查找算法相关的函数。

lower_bound - 下界搜索返回找到元素的位置。

语法

lower_bound(start_pointer , end_pointer, element )

此处,

start_pointer 是一个指针,它保存搜索结构起点的内存位置。

end_pointer 是一个指针,它保存搜索结构终点的内存位置。

element 是要使用该函数查找的元素。

该函数返回要查找的元素的索引。

返回值可能有多个值 -

如果元素在结构中出现一次,则返回其位置。

如果元素在结构中出现多次,则返回第一个元素的位置。

如果元素不在结构中,则返回比元素大的下一个数字的位置。

任何元素的索引都是通过减去结构的基本位置来找到的。

示例

实时演示

#include<bits/stdc++.h>
using namespace std;
int main(){
   vector<int> sortedarray = {2 , 5, 7, 8 , 15, 20 };
   vector<int> sortedarray2 = {2, 3, 4, 6 , 9 , 23 };
   vector<int> sortedarray3 = {2 , 5, 7, 7 , 15, 20 };
   cout<<"The position of element 7 found using lower_bound function :";
   cout<<"\nCase 1 : When element is present in array but only once ";
   cout<<lower_bound(sortedarray.begin() , sortedarray.end(), 7) - sortedarray.begin();
   cout<<"\nCase 2 : When element is present more than one times in the array ";
   cout<<lower_bound(sortedarray3.begin() , sortedarray3.end(), 7) - sortedarray3.begin();
   cout<<"\nCase 3 : When element is not present in the array ";
   cout<<lower_bound(sortedarray2.begin() , sortedarray2.end(), 7) - sortedarray2.begin();
}

输出

The position of element 7 found using lower_bound function :
Case 1 : When element is present in array but only once 2
Case 2 : When element is present more than one times in the array 2
Case 3 : When element is not present in the array 4

upper_bound - 上界搜索返回高于传递元素的元素的位置。

语法

upper_bound(start_pointer , end_pointer, element)

此处,

start_pointer 是一个指针,它保存搜索结构起点的内存位置。

end_pointer 是一个指针,它保存搜索结构终点的内存位置。

element 是要使用该函数查找的元素。

该函数返回其值大于元素值的元素的索引。

返回值可能有多个值 -

如果元素在结构中出现一次,则返回下一个更高元素的位置。

如果元素在结构中出现多次,则返回最后一个元素的下一个元素的位置。

如果元素不在结构中,则返回比元素大的下一个数字的位置。

任何元素的索引都是通过减去结构的基本位置来找到的。

示例

实时演示

#include<bits/stdc++.h>
using namespace std;
int main(){
   vector<int> sortedarray = {2 , 5, 7, 8 , 15, 20 };
   vector<int> sortedarray2 = {2, 3, 4, 6 , 9 , 23 };
   vector<int> sortedarray3 = {2 , 5, 7, 7 , 15, 20 };
   cout<<"The position of element 7 found using upper_bound function :";
   cout<<"\nCase 1 : When element is present in array but only once ";
   cout<<upper_bound(sortedarray.begin() , sortedarray.end(), 7) - sortedarray.begin();
   cout<<"\nCase 2 : When element is present more than one times in the array ";
   cout<<upper_bound(sortedarray3.begin() , sortedarray3.end(), 7) - sortedarray3.begin();
   cout<<"\nCase 3 : When element is not present in the array ";
   cout<<upper_bound(sortedarray2.begin() , sortedarray2.end(), 7) - sortedarray2.begin();
}

输出

The position of element 7 found using upper_bound function :
Case 1 : When element is present in array but only once 3
Case 2 : When element is present more than one times in the array 4
Case 3 : When element is not present in the array 4

binary_search 是一个函数,它检查元素是否在结构中。

语法

binary_search(start_pointer , end_pointer, element)

此处,

start_pointer 是一个指针,它保存搜索结构起点的内存位置。

end_pointer 是一个指针,它保存搜索结构终点的内存位置。

element 是要使用该函数查找的元素。

如果元素存在于结构中,则函数返回 true。否则,它将返回 false。

示例

实时演示

#include<bits/stdc++.h>
using namespace std;
int main(){
   vector<int> sortedarray = {6, 15, 21, 27, 39, 42};
   cout<<"The element to be found in the array is 21\n" ;
   if(binary_search(sortedarray.begin(), sortedarray.end(), 21))
      cout<<"The element is found";
   else
      cout<<"The element is not found";
      cout<<"\nThe element to be found in the array is 5\n" ;
   if(binary_search(sortedarray.begin(), sortedarray.end(), 5))
      cout<<"The element is found";
   else
      cout<<"The element is not found";
}

输出

The element to be found in the array is 21
The element is found
The element to be found in the array is 5
The element is not found

更新于:2020年1月3日

4K+ 次查看

开启你的职业生涯

通过完成课程获得认证

开始学习
广告