二分查詢(binary search)又被稱為折半查詢,它是一種效率較高[
1]的查詢方法。
源資料是有序的——數列有序,數列使用順序儲儲存存結構(例如 陣列 )。
二分查詢不斷地通過比較和取中值來縮小區間的左右邊界,直到命中預期資料。
注意: 對命中資料需要分清鍵值對,在調整區間時,調整的是鍵,而進行資料比較的時候,比較的是值。
演算法(第四版)使用**
static
void
main
(string
args)
;int
arrayl =
newint[5
];foreach
(int key in arrayl)
console.
read()
;}static
intbinarysearch
(int
inputarray,
int key)
return-1
;}
使用遞迴的二分查詢
static
void
main
(string
args)
;int
arrayl =
newint[5
];foreach
(int
value
in arrayl)
console.
read()
;}static
intbinarysearchrecursion
(int
inputarray,
intvalue
,int left,
int right)
else
return-1
;}
插值查詢在元素數值均勻分布的有序陣列裡面, 用插值查詢是很快的2
。特別的,對絕對均勻分布的陣列(相鄰元素差值相同), 插值查詢用一次比較就能查詢成功。
public
static
intinsertsearch
(int
a,int key)
if(key == a[low]
)return low;
// 如果是 2,2,2,2,2這種全部重複元素,返回第乙個2
else
return-1
;}
注意: 一定要保證兩點:
a[low]!=a[high]
( 插值公式裡分母是a[high] - a[low]
,不能等於0)
a[low]<=key<=a[high]
斐波那契查詢
根據待查詢陣列長度確定裴波那契陣列的長度(或最大元素值)
根據1中長度建立該長度的裴波那契陣列,再通過f(0)=1,f(1)=1, f(n)=f(n-1)+f(n-2)生成裴波那契數列為陣列賦值
以2中的裴波那契陣列的最大值為長度建立填充陣列,將原待排序陣列元素拷貝到填充陣列中來, 如果有剩餘的未賦值元素, 用原待排序陣列的最後乙個元素值填充
針對填充陣列進行關鍵字查詢, 查詢成功後記得判斷該元素是否**於後來填充的那部分元素
//測試**,未完成!
時間複雜度
折半搜尋每次把搜尋區域減少一半,時間複雜度為 o
(logn
)o(logn
)。(n代表集合中元素的個數)
空間複雜度
o (1
)o(1)。雖以遞迴形式定義,但是尾遞迴,可改寫為迴圈。
在和順序查詢進行比較時,在資料量較大的情況下,如果源資料是有序的,則二分查詢法效率高,反之順序查詢效率較高(原因是對源資料進行排序需要耗費很長時間)。 ↩︎
二分搜尋在一般的情況下時間複雜度是對數時間,進行 o
(logn
)o(logn
)次比較操作,插值搜尋的最壞時間複雜度是 o(n
)o(n),平均進行 o
(log(
logn)
)o(log(
logn))
次比較操作。因為用插值公式計算搜尋鍵值,能使搜尋範圍比二分法更快縮小。所以除非輸入資料數量很少,否則插值搜尋比二分搜尋與線性搜尋更快,但陣列必須事先被排序。無論對任何大小的輸入資料,插值搜尋演算法使用的空間複雜度一樣是 o(1
)o(1)。 ↩︎
查詢演算法 二分查詢
利用二分查詢演算法查詢某乙個元素,前提條件是該被查詢的元素是乙個已經有序的陣列。二分查詢的思想是將陣列元素的最高位 high 和最低位 low 進行標記,取陣列元素的中間 mid 和和要查詢的值 key 進行比較,如果目標值比中間值要大,則將最低位設定為mid 1,繼續進行查詢。如果目標值小於中間值...
查詢演算法 二分查詢
二分查詢的思路是很簡單的,前提是這組資料是有順序的。思路是從中間找乙個數,判斷大小,如果數比中間數大,說明在中間數到結尾的數中,如果小於,則說明在開始和中間數之間,經過多次相同操作,就可以得到我們想查詢的數時間複雜度就是 o logn 非遞迴的實現 const testarr let i 0whil...
查詢演算法 二分查詢
二分查詢是乙個常用的查詢演算法,其原理在於通過不斷切分乙個規則排序,對半的去尋找目標元素所在的區間與位置。但是其有乙個前提,那就是資料結構需要是順序儲存結構,並且關鍵字大小有序排列。例子如下 例 有乙個數列 12,23,45,56,67,89 請使用二分查詢找到56的位置 解 首先mid 0 5 2...