可查詢重複元素的二分查詢演算法

2021-08-20 06:52:39 字數 1584 閱讀 6068

二分查詢演算法思想:又稱為 折半查詢,二分查詢適合對已經排序好的資料集合進行查詢。假設有一公升序的資料集合,先找出公升序集合中最中間的元素,將資料集合劃分為兩個子集,將最中間的元素和關鍵字key進行比較,如果等於key則返回;如果大於關鍵字key,則在前乙個資料集合中查詢;否則在後乙個子集中查詢,直到找到為止;如果沒找到則返回-1。

思路:1、先定義兩個下標 , left = 0 , right = arr.length -1;

2、因為我們也不知道要迴圈多少次,定義乙個while迴圈,終止條件為right>left

3、因為是二分查詢,定義乙個mid = left + (right - left)/2; //;防止資料過大溢位

4、定義三個if語句,如果 target == arr[mid], return mid;這是經典的二分查詢,我們需要在這做改進

4.1、改進經典二分演算法,二分查詢是基於有序的陣列,重複的元素都在一起。我們只需要在if(target == arr[mid])裡面修改即可;我們需要返回第乙個出現target的下標;因為我們也不知道mid前面有幾個重複的元素因此我們需要乙個while(mid>=0)的迴圈,mid–,然後比對arr[mid]和target,只要不一樣就終止,返回

5、如果 target < arr[mid] , right = mid - 1;

6、如果target > arr[mid] , left = mid + 1;

知道了思路,我們來程式設計實現一下吧

/**

* 可查詢重複元素的二分查詢演算法

* 思路:

* 1、先定義兩個下標 , left = 0 , right = arr.length -1;

* 2、因為我們也不知道要迴圈多少次,定義乙個while迴圈,終止條件為right>left

* 3、因為是二分查詢,定義乙個mid = left + (right - left) / 2;防止資料過大溢位

* 4、定義三個if語句,如果 target == arr[mid], return mid;這是經典的二分查詢,我們需要在這做改進

* 4.1、改進經典二分演算法,因為可能有重複元素,我們需要返回第乙個出現target的下標;因為我們也不知道mid前面有幾個重複的元素

* 因此我們需要乙個while(mid>=0)的迴圈,mid--,然後比對arr[mid]和target,只要不一樣就終止,返回

* 5、如果 target < arr[mid] , right = mid - 1;

* 6、如果target > arr[mid] , left = mid + 1;

*@param nums

*@param target

*@return

*/public

static

intbinarysearch(int nums , int target)

mid--;

}if(mid <= -1 )

return mid + 1;//多減了一次,返回的時候需要再加1

}else

if( target < nums[mid] ) else

}return -1;

}

含有重複元素的二分查詢演算法

rust已經有binary search了,但不能很好的處理有重複元素的查詢。下面這個是我按照網上查詢到的原理自己實現的,這個處理重複元素比較好,如果key有重複,那麼查詢到的總是最小的那個index fn main else 自己實現的二分查詢的結果 println search value nl...

二分查詢有序重複元素

給定乙個按照公升序排列的整數陣列 nums,和乙個目標值 target。找出給定目標值在陣列中的開始位置和結束位置。如果陣列中不存在目標值 target,返回 1,1 高階 你可以設計並實現時間複雜度為 o log n 的演算法解決此問題嗎?示例 1 輸入 nums 5,7,7,8,8,10 tar...

分治 二分查詢之單個元素 可重複元素上下界

目的 在乙個不重複的序列裡,找乙個元素,找不到返回 1。a 元素所在陣列 x,y 區間 v 元素值 int bserach int a,int x,int y,int v return 1 思路就很明了了。目的 當v存在時返回它出現的第乙個位置。如果不存在,返回這樣乙個下標i 在此處插入v 此處元素...