二分查詢也稱折半查詢(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,我們計算時間複雜度是按照最壞的情況進...