Search(2) 二分查詢

2021-09-26 01:25:11 字數 1408 閱讀 9559

折半查詢,也稱二分查詢,在某些情況下相比於順序查詢,使用折半查詢演算法的效率更高。但是該演算法的使用的前提是靜態查詢表中的資料必須是有序的。

例如,在這個查詢表使用折半查詢演算法查詢資料之前,需要首先對該表中的資料按照所查的關鍵字進行排序:。 

在折半查詢之前對查詢表按照所查的關鍵字進行排序的意思是:若查詢表中儲存的資料元素含有多個關鍵字時,使用哪種關鍵字做折半查詢,就需要提前以該關鍵字對所有資料進行排序。

折半查詢演算法 

對靜態查詢表採用折半查詢演算法查詢關鍵字為 21 的過程為:           

如上圖 1 所示,指標 low 和 high 分別指向查詢表的第乙個關鍵字和最後乙個關鍵字,指標 mid 指向處於 low 和 high 指標中間位置的關鍵字。在查詢的過程中每次都同 mid 指向的關鍵字進行比較,由於整個表中的資料是有序的,因此在比較之後就可以知道要查詢的關鍵字的大致位置。

例如在查詢關鍵字 21 時,首先同 56 作比較,由於21 < 56,而且這個查詢表是按照公升序進行排序的,所以可以判定如果靜態查詢表中有 21 這個關鍵字,就一定存在於 low 和 mid 指向的區域中間。

因此,再次遍歷時需要更新 high 指標和 mid 指標的位置,令 high 指標移動到 mid 指標的左側乙個位置上,同時令 mid 重新指向 low 指標和 high 指標的中間位置。如圖 2 所示: 

同樣,用 21 同 mid 指標指向的 19 作比較,19 < 21,所以可以判定 21 如果存在,肯定處於 mid 和 high 指向的區域中。所以令 low 指向 mid 右側乙個位置上,同時更新 mid 的位置。 

當第三次做判斷時,發現 mid 就是關鍵字 21 ,查詢結束。 

注意:在做查詢的過程中,如果 low 指標和 high 指標的中間位置在計算時位於兩個關鍵字中間,即求得 mid 的位置不是整數,需要統一做取整操作。

public int query(int initvals, int targetval) 

// 如果上界小於下界時,說明已經找完全部了,返回-1表示沒有找到

else if (lowbound > upbound)

// 還可以繼續找

else

// 當前指標的數比targetval要大,那麼要往大的方向繼續找

else }}

}

參考:

二分查詢 2

v1中使用while迴圈的方式,我們也可以不使用迴圈,使用遞迴的方式來實現 public static intbinarysearch v2 int array,int value public static intmysearch int array,int start,int end,int v...

2 二分查詢(上)

二分模板有兩個,分別適用於不同的情況。演算法思路 假設目標值在閉區間 l,r 中,每次將區間長度縮小一半,當l r時,我們就找到了目標值。版本一 當我們將區間 l,r 劃分成 l,mid 和 mid 1,r 時,其更新操作時l mid 1或者 r mid 計算mid時不需要加1。版本二 當我們將區間...

2 二分查詢(下)

假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,1,2,4,5,6,7 可能變為 4,5,6,7,0,1,2 搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 1 你可以假設陣列中不存在重複的元素。你的演算法時間複雜度必須是 o log n 級別。輸入...