STL之二分查找 (Binary search in STL)

STL之二分查找 (Binary search in STL)

Section I
正确区分不同的查找算法count,find,binary_search,lower_bound,upper_bound,equal_range 
本文是对Effective STL第45条的一个总结,阐述了各种查找算法的异同以及使用他们的时机。

首先可供查找的算法大致有count,find,binary_search,lower_bound,upper_bound,equal_range。带有判别式的如count_if,find_if或者binary_search的派别式版本,其用法大致相同,不影响选择,所以不作考虑。
注意这些查找算法需要序列式容器,或者数组。关联容器有相应的同名成员函数except binary_search。

首先,选择查找算法时,区间是否排序是一个至关重要的因素。
可以按是否需要排序区间分为两组:
 A. count,find
 B. binary_search,lower_bound,upper_bound,equal_range
A组不需排序区间, B组需要排序区间。
当一个区间被排序,优先选择B组,因为他们提供对数时间的效率。而A则是线性时间。

另外A组B组所依赖的查找判断法则不同,A使用相等性法则(查找对象需要定义operator==), B使用等价性法则(查找对象需要定义operator<,必须在相等时返回false)。

A组的区别
count:计算对象区间中的数目。
find:返回第一个对象的位置。
查找成功的话,find会立即返回,count不会立即返回(直到查找完整个区间),此时find效率较高。
因此除非是要计算对象的数目,否则不考虑count。

B组的区别 {1,3,4,5,6}
binary_search:判断是否存在某个对象
lower_bound: 返回>=对象的第一个位置,lower_bound(2)=3, lower_bound(3)=3
 目标对象存在即为目标对象的位置,不存在则为后一个位置.
upper_bound: 返回>对象的第一个位置, upper_bound(2)=3,upper_bound(3)=4

时间: 2024-12-25 23:24:00

STL之二分查找 (Binary search in STL)的相关文章

【转】STL之二分查找 (Binary search in STL)

Section I正确区分不同的查找算法count,find,binary_search,lower_bound,upper_bound,equal_range 本文是对Effective STL第45条的一个总结,阐述了各种查找算法的异同以及使用他们的时机. 首先可供查找的算法大致有count,find,binary_search,lower_bound,upper_bound,equal_range.带有判别式的如count_if,find_if或者binary_search的派别式版本,其

"二分查找(Binary Search)"与"斐波那契查找(Fibonacci Search)"

首先,我们来看一个笔者的拙作,一段二分查找代码 //返回值是key的下标,如果A中不存在key则返回-1 template <class T> int BinSearch(T* A, const T &key, int lo, int hi) {     int mid;     while(lo<hi)     {         mid = lo + (hi-lo)/2;         if(key < A[mid])             hi = mid-1;

二分查找 Binary Search

简单地用递归的方法实现了二分查找算法,适用于数组. 二分查找算法的前提条件是数组本身是有序的,比如int arr[6] = {2, 3, 5, 7, 11, 13}; 1 int 2 BinarySearch(int arr[], int key, int left, int right) 3 { 4 if (left > right) { 5 return -1; 6 } 7 8 int middle = (left + right) / 2; 9 10 if (arr[middle] ==

【C++】【STL】二分查找函数

binary_search 这个函数的返回值是布尔型,也就是最简单的找到了就为真,没找到就是假. 传入参数有三个,数据集合的左端点,数据集合的右端点,查找的值. 注意这些左端点右端点是要求左开右闭原则的,就是和数学上的左开右闭区间[a, b)一样,右端点是个不会被查阅的值. 一般来说写法类似: bool flag = false; int data[n] = {...};///数据 sort(data, data + n); flag = binary_search(data, data + n

STL之二分查找 (转载)

转载自:地址 Section I正确区分不同的查找算法count,find,binary_search,lower_bound,upper_bound,equal_range 本文是对Effective STL第45条的一个总结,阐述了各种查找算法的异同以及使用他们的时机. 首先可供查找的算法大致有count,find,binary_search,lower_bound,upper_bound,equal_range.带有判别式的如count_if,find_if或者binary_search的

[FAFU 1266]STL排序+二分查找

http://acm.fafu.edu.cn/problem.php?id=1266 思路很容易理解: #include<cstdio> #include<algorithm> using namespace std; int num[1000000]; int main() { int n,m,a; while(~scanf("%d",&n)) { for(int i=0;i<n;++i) { scanf("%d",&

算法导论 2.3-5 二分查找

1.二分查找(Binary Search) 二分查找又称折半查找,它是一种效率较高的查找方法.    二分查找要求:线性表是有序表,即表中结点按关键字有序,并且表的存储结构为顺序结构.不妨设有序表是递增有序的. 2.二分查找的基本思想 二分查找算法思想: (1)首先确定该区间的中点位置: mid = ( left + right ) / 2; (2)然后将待查的K值与R[mid].key比较,若相等,则查找成功并返回此位置:否则须确定新的查找区间,继续二分查找,具体方法如下: ①若R[mid].

转:线性表的查找-二分查找

转自:http://student.zjzk.cn/course_ware/data_structure/web/chazhao/chazhao9.2.2.1.htm 二分查找 1.二分查找(Binary Search)     二分查找又称折半查找,它是一种效率较高的查找方法.    二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用向量作为表的存储结构.不妨设有序表是递增有序的. 2.二分查找的基本思想    二分查找的基本思想是:(设R[low..high]是当前的查找区间) 

Binary Search 二分查找总结

Binary Search基本的复杂度为O(logn).如果提示需要对O(n)的算法进行优化,非常可能就是二分,另外二分一般出现在排序数组或者变形后的排序数组(rotated array)当中.二分主要有两种,binary search on index(index上的二分)和binary search on result(结果上的二分).index上的二分主要有 result上的二分主要有Sqrt(x),Wood cut两种. 另外binary search的版本很多,区别在终结条件,比如是l