演算法 二分查詢與其他

2021-09-25 10:38:00 字數 3288 閱讀 5676

二分查詢(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

(log⁡n

)o(logn

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

空間複雜度

o (1

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

在和順序查詢進行比較時,在資料量較大的情況下,如果源資料是有序的,則二分查詢法效率高,反之順序查詢效率較高(原因是對源資料進行排序需要耗費很長時間)。 ↩︎

二分搜尋在一般的情況下時間複雜度是對數時間,進行 o

(log⁡n

)o(logn

)次比較操作,插值搜尋的最壞時間複雜度是 o(n

)o(n),平均進行 o

(log⁡(

log⁡n)

)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...