二分查詢的遞迴和非遞迴

2021-09-07 05:57:47 字數 2426 閱讀 1849

常見的查詢演算法大概有順序查詢、二分查詢、二叉排序樹查詢、雜湊表法(雜湊表)、分塊查詢等,

下面簡單了解一下其他幾種查詢演算法。

1.順序查詢

也就是暴力方法,按順序比較每個元素,直到找到關鍵字為止。

條件:無序或有序資料,時間複雜度:o(n)

2.二叉排序樹查詢

二叉排序樹的性質:

1. 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;

2. 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;

3. 它的左、右子樹也分別為二叉排序樹。

在二叉查詢樹b中查詢x的過程為:

1. 若b是空樹,則搜尋失敗,否則:

2. 若x等於b的根節點的資料域之值,則查詢成功;否則:

3. 若x小於b的根節點的資料域之值,則搜尋左子樹;否則:

4. 查詢右子樹。

時間複雜度:o(\log_2(n))  

3.雜湊表查詢

建立雜湊表(雜湊表)

雜湊查詢的操作步驟:⑴用給定的雜湊函式構造雜湊表⑵根據選擇的衝突處理方法解決位址衝突⑶在雜湊表的基礎上執行雜湊查詢。

建立雜湊表操作步驟: ① 取資料元素的關鍵字key,計算其雜湊 函式值。若該位址對應的儲存 空間還沒有被占用,則將該元素存入;否則執行step2解決衝突。 ② 根據選擇的衝突處理方法,計算關鍵字 key的下乙個儲存位址。若下乙個儲存地 址仍被占用,則繼續執行step2,直到找 到能用的儲存位址為止。

時間複雜度:幾乎是o(1),取決於產生衝突的多少。

4.分塊查詢

將n個資料元素"按塊有序"劃分為m塊(m ≤ n)。

每一塊中的結點不必有序,但塊與塊之間必須"按塊有序";

即第1塊中任一元素的關鍵字都必須小於第2塊中任一元素的關鍵字;

而第2塊中任一元素又都必須小於第3塊中的任一元素,……。

然後使用二分查詢及順序查詢。

一般是操作有序陣列,查詢過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則搜素過程結束;

如果某一特定元素大於或者小於中間元素,則在陣列大於或小於中間元素的那一半中查詢,而且跟開始一樣從中間元素開始比較。如果在某一步驟陣列為空,則代表找不到。

這種搜尋演算法每一次比較都使搜尋範圍縮小一半。時間複雜度:o(logn)。

二分查詢一般是用在有序序列的查詢,很多時候查詢需要結合排序操作來進行。

但是需要注意,二分查詢並不一定非要在有序序列中才能得到應用,

只要在二分之後可以淘汰掉一半資料的場景,都可以應用二分搜尋。

public static int binsearch(int arr,int des)

int left=0;

int right=arr.length-1;//注意防止陣列下標越界

/*** 這裡的判斷條件必須包含等於,

* 考慮,查詢1,如果不判斷等於,就丟失了比較導致查詢錯誤

*/while(left<=right)else if(des折半查詢,一般將待比較的key值與第mid=(low+high)/2位置的元素比較,

同時為了防止溢位,使用更高效的移位,也可以記做 mid=low+((low+high)>>1)。

比較結果分三種情況

1)相等,mid位置的元素即為所求

2)> ,low=mid+1;

3)< ,high=mid-1;

斐波那契查詢要求元素表中記錄的個數為某個斐波那契數減1,即n=fk-1;

斐波那契數列:0、1、1、2、3、5、8、13、21、……

如果設f(n)為該數列的第n項(n∈n)。那麼這句話可以寫成如下形式:

f(0) = 0,f(1)=1,f(n)=f(n-1)+f(n-2) (n≥2),

這是乙個線性遞推數列,斐波那契數列的演算法實現經常在資料結構教材的遞迴一節中出現。

對於二分查詢,分割是從mid=(low+high)/2開始;而對於斐波那契查詢,分割是從mid = low + f[k-1] - 1開始的; 通過上面知道了,陣列a現在的元素個數為f[k]-1個,即陣列長為f[k]-1,mid把陣列分成了左右兩部分, 左邊的長度為:f[k-1] - 1, 那麼右邊的長度就為(陣列長-左邊的長度-1), 即:(f[k]-1) - (f[k-1] - 1) = f[k] - f[k-1] - 1 = f[k-2] - 1。

斐波那契查詢的核心是:

1)當key=a[mid]時,查詢成功;

2)當keya[mid]時,新的查詢範圍是第mid+1個到第high個,此時範圍個數為f[k-2] - 1個,即陣列右邊的長度,所以要在[f[k - 2] - 1]範圍內查詢。

與二分查詢相比,斐波那契查詢它只涉及加法和減法運算,而不用除法(用「>>1」要好點)。因為除法比加減法要慢,在海量資料的查詢過程中,這種細微的差別可能會影響最終的效率。

參考《大話資料結構》

二分查詢 遞迴和非遞迴

二分查詢要求 資料儲存在順序儲存結構中 數字有序排放 原理 將陣列分為三部分,依次是左值,中值,右值 將要查詢的值和陣列的中值進行比較,若小於中值則在中值前 面找,若大於中值則在中值後面找,等於中值時直接返回。然後依次是乙個遞迴過程,將前半部分或者後半部分繼續分解為三部分。迴圈實現二分查詢 temp...

遞迴和非遞迴的二分查詢

思路很簡單,注釋已標註 include 遞迴二分查詢 int binarysearch int start,int end,intfinddata int mid start end start 2 根據中間值不斷二分縮小待查元素所在範圍 if finddata mid else if findda...

二分查詢的遞迴和非遞迴

二分查詢,這個適用於已經排序好了的陣列,沒有排序那就先排序,不過要根據實際的情況,要是排序代價很小,這樣很好了 2.15,在有序陣列中查詢,利用二分查詢的方法 include using namespace std 二分查詢 也可以通過遞迴實現 int sort int a,int length,i...