二分查詢演算法

2021-10-02 02:37:46 字數 2595 閱讀 9823

~~~~

在計算機科技中,二分查詢演算法,也稱為折半搜尋演算法、對數搜尋演算法,是一種在有序數列中查詢某一特定元素的搜尋演算法。搜尋過程從陣列的中間元素開始,如果中間元素正好要查詢的元素,則搜尋過程結束;如果某一特定元素大於或者小於中間元素,則陣列大於或小於中間元素的那一半中查詢,而且跟開始一樣從中間元素開始比較。如果在某一步驟陣列為空,則代表找不到。這種搜尋演算法每一次比較都使搜尋範圍縮小一半。

~~~~

二分查詢演算法在情況下的複雜度是對數時間,進行o(l

ogn)

o(log n)

o(logn

)次比較操作(n

nn在此次是陣列的元素數量,o

oo是大o記號,log

loglo

g是對數)。二分查詢演算法使用常數空間,無論對任何大小的輸入資料,演算法使用的空間都是一樣的。除非輸入資料數量很少,否則二分查詢演算法比線性搜尋更快,但陣列必須是先被排序。儘管特定的、為了快速搜尋而設定的資料結構更有效(比如雜湊表),二分查詢演算法應用更廣。

~~~~

二分查詢演算法有許多變種。比如分散層疊可以提公升在多個陣列中對乙個數值的搜尋。分散層疊有效的解決了計算幾何學和其他領域的許多搜尋問題。指數搜尋將二分查詢演算法擴寬到無邊界的列表。二叉搜尋樹和b樹資料結構就是基於二分查詢演算法的。

~~~~

~~~~

給予乙個包含n

nn個帶值元素的陣列a

aa或是記錄a0,

...,

an−1

a_0,...,a_

a0​,..

.,an

−1​,使a0≤

...≤

an−1

a_0~\leq...\leq~a_

a0​≤..

.≤an

−1​,以及目標值t

tt,還有下列用來查詢t

tt在a

aa中位置的子程式。

1.令l

ll為0,r

rr為n−1

n-1n−

1。2.如果l

>

rl > r

l>

r,則查詢以失敗告終。

3.令m

mm(中間值元素為)[(l

+r)/

2]

[(l + r) / 2]

[(l+r)

/2]。(具體實現中,為防止演算法溢位,一般採用l+(

r−l)

/2

l + (r - l) / 2

l+(r−l

)/2代替。)

4.如果a

m<

ta_mam

​<

t,令l

ll為m+1

m+1m+

1並回到步驟二。

5.如果a

m>

ta_m>t

am​>

t,令r

rr為m−1

m-1m−

1並回到步驟二。

6.當am=

ta_m=t

am​=

t,查詢結束;會傳值mmm。

這個迭代步驟會持續透過兩個變數追蹤搜尋的邊界。有些實際應用會在演算法的最後放入相等比較,這比較迴圈更快,但平均而言會多一層迭代。

~~~~

以上程式值適用於完全匹配,也就是查詢乙個目標值得位置。不過,因為有序陣列的順序性,將二分搜尋演算法擴充套件到能適用大致匹配並不是很重要。舉例來說,二分搜尋演算法可以用來計算乙個賦值的排名(或稱跌,比它更小的元素的數量)、前趨(下乙個最小元素)、後繼(下乙個最大元素)以及最近鄰。查詢兩個值之間的元素數目的範圍查詢可以藉由兩個排名查詢(又稱秩查詢)來執行。

排名查詢可以使用調整版的二分搜尋來執行。借助在成功的搜尋回傳m

mm,以及在失敗的搜尋回傳l

ll,就會取而代之地回傳了比起目標值小的元素數目。

前趨和後繼查詢可以藉由排名 查詢來執行。一旦知道目標值得排名,其前趨就會是那個位於其排名位置的元素,或者排名位置的上乙個元素(因為他是乙個目標值得最大元素)。其後繼是(陣列中的)下乙個元素,或是(非陣列中的)前趨的下乙個元素。目標值得最近鄰可能是前趨或後繼,取決於何者較為接近。

範圍查詢也是直接了當。一旦知道兩個值的排名,不小於第乙個值且小於第二個值得元素就會是兩者排名的差。這個值可以根據範圍的端點是否在範圍內,或是陣列是否包含其端點的對應鍵來增加或減少1。

時間複雜度:折半搜尋每次把搜尋區域減少一半,時間複雜度o(l

ogn)

o(log~n)

o(logn

)。(n代表集合中元素的個數)

空間複雜度:o(1

)o(1)

o(1)

。雖以遞迴形式定義,但是尾遞迴,可改寫為迴圈。

除直接在乙個陣列中查詢元素外,可用在插入排序中。

int

binary_search

(const

int arr,

int start,

int end,

int key)

}return ret;

// 單一出口

}

查詢演算法 二分查詢

利用二分查詢演算法查詢某乙個元素,前提條件是該被查詢的元素是乙個已經有序的陣列。二分查詢的思想是將陣列元素的最高位 high 和最低位 low 進行標記,取陣列元素的中間 mid 和和要查詢的值 key 進行比較,如果目標值比中間值要大,則將最低位設定為mid 1,繼續進行查詢。如果目標值小於中間值...

查詢演算法 二分查詢

二分查詢的思路是很簡單的,前提是這組資料是有順序的。思路是從中間找乙個數,判斷大小,如果數比中間數大,說明在中間數到結尾的數中,如果小於,則說明在開始和中間數之間,經過多次相同操作,就可以得到我們想查詢的數時間複雜度就是 o logn 非遞迴的實現 const testarr let i 0whil...

查詢演算法 二分查詢

二分查詢是乙個常用的查詢演算法,其原理在於通過不斷切分乙個規則排序,對半的去尋找目標元素所在的區間與位置。但是其有乙個前提,那就是資料結構需要是順序儲存結構,並且關鍵字大小有序排列。例子如下 例 有乙個數列 12,23,45,56,67,89 請使用二分查詢找到56的位置 解 首先mid 0 5 2...