c stl 二分查詢

2021-08-22 17:48:38 字數 1611 閱讀 4875

binary_search(a,a+n,key)   //返回是否存在值bool型的

lower_bound(a,a+n,key) //下面兩個都是指標型的

upper_bound(a,a+n,key)

//公升序排列的容器:

lower_bound( const key_type &key ): 返回乙個迭代器,指向鍵值》= key的第乙個元素。

upper_bound( const key_type &key ): 返回乙個迭代器,指向鍵值》key的第乙個元素。

//降序排列的容器:

lower_bound( const key_type &key ): 返回乙個迭代器,指向鍵值<= key的第乙個元素。

upper_bound( const key_type &key ):返回乙個迭代器,指向鍵值

這個函式的返回值是布林型,也就是最簡單的找到了就為真,沒找到就是假。

傳入引數有三個,資料集合的左端點,資料集合的右端點,查詢的值。

注意這些左端點右端點是要求左開右閉原則的,就是和數學上的左開右閉區間[a, b)一樣,右端點是個不會被查閱的值。

這兩個函式的返回值是位址或迭代器,也就是標準庫中的容器iterator。當然,實際運用中必須用返回值減去集合首位址才能正常的獲取我們習慣的陣列下標。如果沒有檢索到查詢元,返回資料集合的首位址。引數什麼的和binary_search一樣。額外注意的是upper_bound返回的是下標真實值+1,換句話說,乙個集合a = ,如果陣列下表從0開始記錄,那麼upper_bound(a, a + 10, 4)的返回值是第七個元素的位址。但是實際上第六個元素是最後乙個4。(1)分析:既然lower_bound()函式返回的是first的指標,那就看first指標變化的位置——first = middle + 1;的條件是 嚴格的小於(=)時first的位置是不變的。或者可以這樣理解,當middle指向的值 < key時,first 指向middle的下乙個位置,而下乙個位置可能等於或者大於key;因此 該函式是返回乙個非遞減序列[first, last)中的第乙個大於等於值val的位置。

(2)分析:既然upper_bound()函式返回的是first的指標,那就看first指標變化的位置——first = middle + 1;的條件是 小於等於(<=),即只有嚴格大於(>)時first的位置是不變的。或者可以這樣理解,當middle指向的值 <= key時,first 指向middle的下乙個位置,而下乙個位置可能等於或者大於key,但是要是仍是等於的話,first會繼續指向middle的下一位置,直到大於為止;因此 該函式是返回乙個非遞減序列[first, last)中的第乙個大於值val的位置。

(3)分析:既然binary_search()函式返回的是middle 或 未找到時的指標,那就看middle指標變化的位置——mid = low + (high - low)/2;的條件是最外層while的條件(沒有條件限制)第一次相等時就返回middle,或者查詢失敗;因此 該函式是返回乙個非遞減序列[first, last)中的第一次找到的等於值val的位置,有可能是第乙個中間的最後乙個(如有序序列 ……3 3 3 ……)。

c STL 二分查詢

人生第一篇部落格和大家分享一下上週周賽的一道題目二分查詢 題目如下 e 二分查詢 一 蒜頭君手上有個長度為 n的陣列 a。由於陣列實在太大了,所以蒜頭君也不知道陣列裡面有什麼數字,所以蒜頭君會經常詢問整數 x是否在陣列 a 中。輸入格式 第一行輸入兩個整數 n和 m,分別表示陣列的長度和查詢的次數。...

C STL 二分查詢

自 二分查詢的函式有 3 個 參考 c lower bound 和upper bound lower bound 起始位址,結束位址,要查詢的數值 返回的是數值第乙個出現的位置。upper bound 起始位址,結束位址,要查詢的數值 返回的是數值最後乙個出現的位置。binary search 起始...

迭代二分查詢二分查詢

在寫這篇文章之前,已經寫過了幾篇關於改迭代二分查詢主題的文章,想要了解的朋友可以去翻一下之前的文章 bentley在他的著作 writing correct programs 中寫道,90 的計算機專家不能在2小時內寫出完整確正的二分搜尋演算法。難怪有人說,二分查詢道理單簡,甚至小學生都能明確。不過...