(轉)STL之二分查找(binary_search(),lower_bound(),upper_bound() )

二分查找(二分檢索):

 

二分法檢索又稱折半檢索,二分法檢索的基本思想是設字典中的元素從小到大有序地存放在數組array)中,     首先將給定值key與
 
字典中間位置上元素的關鍵碼(key)比較,如果相等,則檢索成功;       否則,若key小,則在字典前半部分中繼續進行二分法檢索;若
 
key大,則在字典後半部分中繼續進行二分法檢索。     這樣,經過一次比較就縮小一半的檢索區間,如此進行下去,直到檢索成功或
 
檢索失敗。      偶數個取中間2個其中任何一個作爲中間元素。        二分法檢索是一種效率較高的檢索方法,要求字典在順序表中按
 
鍵碼排序。
 
 
 
二分查找函數:binary_search():
 
頭文件:  #include<algorithm>
 
函數模板:binary_search(arr[],  size  ,  indx)         
 
參數說明:     arr[]: 數組首地址;
                         size:  數組元素個數;
                         indx:    需要查找的值。
 
函數功能:  在數組中以二分法檢索的方式查找,若在數組(要求數組元素非遞減)中查找到indx元素則返回其下標,若查找不到則返回值爲假。
 
 
 
lower_bound():
 
頭文件:  #include<algorithm>
 
函數模板: 如 binary_search()
 
函數功能:  函數lower_bound()在first和last中的前閉後開區間進行二分查找,返回大於或等於val的第一個元素位置。如果所有元素都小於val,則返回last的位置
 
舉例如下:
 

一個數組number序列爲:4,10,11,30,69,70,96,100.設要插入數字3,9,111.pos爲要插入的位置的下標

 

pos = lower_bound( number, number + 8, 3) - number,pos = 0.即number數組的下標爲0的位置。

 

pos = lower_bound( number, number + 8, 9) - number, pos = 1,即number數組的下標爲1的位置(即10所在的位置)。

pos = lower_bound( number, number + 8, 111) - number, pos = 8,即number數組的下標爲8的位置(但下標上限爲7,所以返回最後一個元素的下一個元素)。

 

所以,要記住:函數lower_bound()在first和last中的前閉後開區間進行二分查找,返回大於或等於val的第一個元素位置。如果所有元素都小於val,則返回last的位置,且last的位置是越界的!!~

返回查找元素的第一個可安插位置,也就是“元素值>=查找值”的第一個元素的位置

 

upper_bound():

 

頭文件:#include<algorithm>

 

函數模板: 如binary_search()

 

函數功能:函數upper_bound()返回的在前閉後開區間查找的關鍵字的上界,返回大於val的第一個元素位置

 

例如:一個數組number序列1,2,2,4.upper_bound(2)後,返回的位置是3(下標)也就是4所在的位置,同樣,如果插入元素大於數組中全部元素,返回的是last。(注意:數組下標越界)

返回查找元素的最後一個可安插位置,也就是“元素值>查找值”的第一個元素的位置

 

注意:

         lower_bound(val): 返回容器中第一個值【大於或等於】val的元素的iterator位置。
         upper_bound(val): 返回容器中第一個值【大於】val的元素的iterator位置。
 
拓展:
         insert()用法:
              比如vector _rows中已經有了{0,1,3,5}
              這時要放入4,則std::lower_bound( _rows.begin(), _rows.end(), 4);將會返回5,就是應該插入的那個位置後面的那個值
             然後_rows.insert( iter, 4);這句將按照從小到大的順序將4放進去,最後的順序是{0,1,3,4,5}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章