二分查詢及變種二分查詢

2021-08-17 11:28:33 字數 1941 閱讀 5775

二分查詢也稱折半查詢(binary search),它的查詢效率很好。二分查詢有乙個要求是必須採用順序儲存結構,而且表種的元素是有序的。只有滿足這個條件我們才能使用二分查詢。

查詢條件:

查詢區域的左邊界,小於等於查詢區域的右邊界

查詢過程:

1. 迴圈條件 == 查詢條件  

2.計算序列中間下標位置

3.如果待查詢值value == 中間位置的元素的值 返回當前中間位置下標

4.如果待查詢值value   >   序列中間位置元素的值  左邊界等於中間位置+1

5.如果帶查詢值value    <  序列中間位置元素的值   右邊界等於中間位置-1

6.如果迴圈結束 返回 -1   (也就是沒查詢到,返回-1)

源**:

/**

* 二分查詢值元素

* 引數:陣列 開始點 結束點 值

* 返回值:

* 找到了返回該點下標

* 找不到返回-1

* @param array

* @param value

* @param begin

* @param end

* @return

*/public static int search(int array, int value, int begin, int end) else if (value > array[mid]) else

}return -1;

}

變種二分查詢:

何為變種的二分查詢,變種的二分查詢就是在二分查詢的模式下,查詢各種你想要的和value直接的或間接的相關的元素。

下面是變種二分查詢的架子。

while (begin <= end)  else 

}

迴圈條件,計算中間值,都是一樣的。這裡我們著重看選擇語句中的判斷條件和執行的操作。

例如:陣列元素中含有多個相同的元素,我們想查詢和value相同的元素中第乙個出現的。那麼我們要怎麼設計這個變種的二分查詢演算法呢?

查詢條件:

查詢區域的左邊界,小於等於查詢區域的右邊界

查詢過程:

1. 迴圈條件 == 查詢條件  

2.計算序列中間下標位置

4.如果待查詢值value   >   序列中間位置元素的值  右邊界等於中間位置-1

5.如果帶查詢值value    <  序列中間位置元素的值   左邊界等於中間位置+1

6.如果迴圈結束 判斷 左邊界小於陣列長度 並且左邊界所在位置的值等於value 返回左邊界下標

7.否則返回 -1   (也就是沒查詢到,返回-1)

/**

* 查詢等於value 的元素中第乙個出現的元素

*/static int firstequalevent(int array, int value)

else

}if (begin< array.length && array[begin] == value)

return -1;

}

示例:相反要查詢等於value 的元素中最後乙個出現的元素、

/**

* 查詢等於value 的元素中最後乙個出現的元素

*/static int firstequalevent(int array, int value)

else

}if (end >=0 && array[end] == value)

return -1;

}

總結:

變種的二分查詢有很多種,我們可以自行去實現自己想要的查詢方式,一般都不難理解。只要了解了什麼是二分查詢,自己腦海中能模擬出二分查詢的規律,那麼我相信對於變種的二分查詢,你也能找到合理的實現方式。

二分查詢及其變種

返回帶查詢元素key的下標。若沒有key元素,則返回 1。注意 1 while迴圈的條件是low high 2 每次迭代hi mid 1 或lo mid 1 二分查詢,找到該值在陣列中的下標,否則為 1 static int binaryserach int array,int key else i...

二分查詢 變種總結

二分查詢是乙個基礎的演算法,二分查詢就是將查詢的鍵和子陣列的中間鍵作比較,如果被查詢的鍵小於中間鍵,就在左子陣列繼續查詢 如果大於中間鍵,就在右子陣列中查詢,否則中間鍵就是要找的元素。在開發中,需求大概有以下幾種 查詢指定值首次出現下標 查詢指定值最後一次出現下標 查詢小於指定值的最大數的下標 查詢...

二分查詢及其變種

3 二分查詢變種總結 時間複雜度概念還不清楚的可以先看 這個文章 由於二分查詢每次查詢都是從陣列中間切開查詢,所以每次查詢,剩餘的查詢數為上一次的一半,從下表可以清晰的看出查詢次數與剩餘元素數量對應關係 肯定是大於等於1,也就是n 2 k frac 2k n 1,我們計算時間複雜度是按照最壞的情況進...