資料結構 有序表查詢及實現

2021-10-09 21:23:25 字數 1684 閱讀 4041

折半查詢(binary search),又稱為二分查詢。它的前提就是u是線性表中的記錄必須有序的,線性表必須採用順序儲存。

折半查詢的基本思想:在有序表中,取中間記錄作為比較物件,若給定值與中間記錄的關鍵字相等,則查詢成功;若給定值小於中間記錄的關鍵字,則在中間記錄的左半區繼續查詢;若給定值大雨中間記錄的關鍵字,則在中間記錄的右半區繼續查詢。不斷重複上述過程,直到查詢成功,或所有查詢區域無記錄,查詢失敗為止。

/* 折半查詢 */

intbinary_search

(int

*a,int n,

int key)

}return0;

}

該演算法還是比較容易理解的,假使總共有n個元素,那麼二分後每次查詢的區間大小就是n,n/2,n/4,…,n/2^k(接下來操作元素的剩餘個數),其中k就是迴圈的次數。

最壞的情況是k次二分之後,每個區間的大小為1,找到想要的元素

令n/2^k=1,

可得k=log2n,(是以2為底,n的對數),所以時間複雜度可以表示o()=o(logn).

插值查詢是根據要查詢的關鍵字key與查詢表彙總的最大最小記錄的關鍵字比較後的查詢方法,其核心就在於插值的計算公式

應該說從時間複雜度來看,他也是o(logn),但對於表長比較大,而關鍵字分布又比較均勻的查詢表來說,插值查詢演算法的平均i效能比折半查詢要好的多。

/* 插值查詢 */

intinterpolation_search

(int

*a,int n,

int key)

return0;

}

斐波那契查詢與折半查詢很相似,他是根據斐波那契序列的特點對有序表進行分割的。他要求開始表中記錄的個數為某個斐波那契數小1,即n=f(k)-1;

開始將k值與第f(k-1)位置的記錄進行比較(及mid=low+f(k-1)-1),比較結果也分為三種

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

2)> ,low=mid+1,k-=2;說明:low=mid+1說明待查詢的元素在[mid+1,hign]範圍內,k-=2 說明範圍[mid+1,high]內的元素個數為n-(f(k-1))= fk-1-f(k-1)=fk-f(k-1)-1=f(k-2)-1個,所以可以遞迴的應用斐波那契查詢

3)< ,high=mid-1,k-=1;說明:low=mid+1說明待查詢的元素在[low,mid-1]範圍內,k-=1 說明範圍[low,mid-1]內的元素個數為f(k-1)-1個,所以可以遞迴的應用斐波那契查詢

同樣,斐波那契查詢的時間複雜度還是o(log 2 n ),但是 與折半查詢相比,斐波那契查詢的優點是它只涉及加法和減法運算,而不用除法,而除法比加減法要占用更多的時間,因此,斐波那契查詢的執行時間理論上比折半查詢小,但是還是得視具體情況而定。

/* 斐波那契查詢 */

intfibonacci_search

(int

*a,int n,

int key)

else

if(key>a[mid]

)else

}return0;

}

資料結構 有序表查詢

對於已經排好序的表,有 在有序表中,取中間的記錄進行比較,如果相同,匹配成功。如果比中間值小,就在中間記錄的左半區進行查詢,如果大,就在右半區。public static intbinarysearch int key return 1 插值查詢是對折半查詢的改進。折半時 mid l ow h ei...

大話資料結構 順序表 有序表 線性索引查詢

查詢 根據給定的某個值,在查詢表中確定乙個其關鍵字 唯一的標識乙個記錄 等於給定值的資料元素或資料記錄。靜態查詢 只查詢,不修改元素 線性表 順序查詢 二分查詢 動態查詢 查詢時,插入或者刪除元素 二叉排序樹 順序表查詢 順序查詢 針對靜態查詢表 也叫線性查詢o n 從頭開始遍歷,直到最後乙個記錄。...

資料結構 PHP實現查詢表

基本演算法 假設有乙個陣列,需要找出某個值在該陣列中的位置。二分查詢 function bin sch array low high k elseif k array mid else return 1 順序查詢 function seq sch array n k if i n else 測試 a...