折半查找概念
折半查找,又稱二分查找。
前提是線性表中的記錄必須是關鍵碼有序(由小到大或由大到小),線性表必須采用順序存儲。
折半查找的基本思想是:在有序表中,取中間值為比較對象,如果給定的值和中間值的關鍵字相等,則查找成功;若給定值小於中間記錄的關鍵字,則在中間記錄的左半區繼續查找;若給定的值大於中間值的關鍵字,則在中間記錄的右半區繼續查找。重復上述過程,直到查找成功,或查找所有區域無記錄,返回查找失敗。
算法實現
public int Binary_Search(int[] a, int n, int key) {
int low = 1, high = n, mid;
while(low <= high) {
mid = (int)((low + high) / 2);
if(key < a[mid]) {
high = mid - 1;
}
else if(key > a[mid]) {
low = mid + 1;
}
else return mid;
}
return 0;
}
通常會使用三個指針low,high,mid。分別表示查找區域的最左值下標,查找區域的最右值下標,已經當前比對值下標。
時間復雜度分析
折半查找其實等於是把靜態有序查找表分成了兩棵子樹,即查找經過只需要找其中的一半數據即可,等於工作量少了一半,以提升效率。
完全二叉樹存在定義:
具有n個節點的我拿權二叉樹深度為log2n + 1
盡管折半查找判定二叉樹並不是完全二叉樹,但同樣相同的推倒可以得到關鍵字或查找失敗的次數是log2n + 1。最好為情況下查詢次數為1。所有折半查找算法的時間復雜度為O(logn + 1)。
缺點
折半查找的前提是需要有序表順序存儲,對於靜態查找表,一次排序后不再變化,但對於需要頻繁執行插入或刪除操作的數據集來說,維護有序的排序會帶來不小的工作量,這個時候不建議使用。