~~~~
在計算機科技中,二分查詢演算法,也稱為折半搜尋演算法、對數搜尋演算法,是一種在有序數列中查詢某一特定元素的搜尋演算法。搜尋過程從陣列的中間元素開始,如果中間元素正好要查詢的元素,則搜尋過程結束;如果某一特定元素大於或者小於中間元素,則陣列大於或小於中間元素的那一半中查詢,而且跟開始一樣從中間元素開始比較。如果在某一步驟陣列為空,則代表找不到。這種搜尋演算法每一次比較都使搜尋範圍縮小一半。
~~~~
二分查詢演算法在情況下的複雜度是對數時間,進行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時間複雜度:折半搜尋每次把搜尋區域減少一半,時間複雜度o(lmm,以及在失敗的搜尋回傳l
ll,就會取而代之地回傳了比起目標值小的元素數目。
前趨和後繼查詢可以藉由排名 查詢來執行。一旦知道目標值得排名,其前趨就會是那個位於其排名位置的元素,或者排名位置的上乙個元素(因為他是乙個目標值得最大元素)。其後繼是(陣列中的)下乙個元素,或是(非陣列中的)前趨的下乙個元素。目標值得最近鄰可能是前趨或後繼,取決於何者較為接近。
範圍查詢也是直接了當。一旦知道兩個值的排名,不小於第乙個值且小於第二個值得元素就會是兩者排名的差。這個值可以根據範圍的端點是否在範圍內,或是陣列是否包含其端點的對應鍵來增加或減少1。
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...