資料結構 21 查詢之靜態查詢表

2021-07-10 08:16:33 字數 4673 閱讀 5730

查詢的定義:給定乙個值k,在含有n個結點的表(或檔案)中找出關鍵字等於給定值k的結點,若找到,則查詢成功,輸出該結點在表中的位置;否則查詢失敗,輸出查詢失敗的資訊。

查詢表是由具有同一型別(屬性)的資料元素(記錄)組成的集合。分靜態查詢表和動態查詢表兩類。

靜態查詢表:僅對查詢表進行查詢操作,而不改變查詢表中的資料元素;

動態查詢表:對查詢表除進行查詢操作外,可能還要進行向表中插入資料元素,或刪除表中資料元素的表。

監視哨作用:避免每步都去判斷是否查詢結束。

測試用例:查詢75和80

**實現:

//package search;

public class staticsearch

return i; }

public static void main(string args) ;//0號單元不使用

int key = 75;

int result = searchseq(st, key);

if(result > 0)

system.out.println("查詢" + key + "成功,在查詢表中的位置是" + result);

else

system.out.println("查詢" + key + "失敗");

key = 80;

result = searchseq(st, key);

if(result > 0)

system.out.println("查詢" + key + "成功,在查詢表中的位置是" + result);

else

system.out.println("查詢" + key + "失敗");

}}

執行結果:

演算法分析

查詢成功時的平均查詢次數為:

asl=(1+2+3+4+……+n)/n = (n+1)/2   ①

查詢不成功時的比較次數為:

asl=(n(n+1))/n = n+1               ②

則順序查詢的平均查詢長度為:

asl==(① + ②)/2 = 3(n+1)/4

優點:演算法簡單,無需排序,採用順序和鏈式儲存均可。

缺點:平均查詢長度較大。

查詢思想:先確定待查詢記錄所在的範圍,然後逐步縮小範圍,直到找到或確認找不到該記錄為止。

前提條件:必須在具有順序儲存結構有序表中進行。

示例:假設給定有序表中10個關鍵字為8,17,25,44,68,77,98,100,115,125,將查詢k=17和k=120的情況

**實現:

//package search;

public class staticsearch

return 0;//low > high時表明查詢失敗 }

public static void main(string args) ;//0號單元不使用

int key = 17;

int result = searchseq(st, key);

if(result > 0)

system.out.println("查詢" + key + "成功,在查詢表中的位置是" + result);

else

system.out.println("查詢" + key + "失敗");

key = 120;

result = searchseq(st, key);

if(result > 0)

system.out.println("查詢" + key + "成功,在查詢表中的位置是" + result);

else

system.out.println("查詢" + key + "失敗");

}}

執行結果:

演算法分析:

為了分析二分查詢的效能,可以用二叉樹來描述二分查詢過程。把當前查詢區間的中點作為根結點,左子區間和右子區間分別作為根的左子樹和右子樹,左子區間和右子區間再按類似的方法,由此得到的二叉樹稱為二分查詢的判定樹

例:關鍵字序列的判定樹

由於第 k 層結點的查詢次數各為 k 次(根結點為第1層),而第 k 層結點數最多為 2^(k-1) 個。假設該二叉樹深度為 h,則等概率下,二分查詢的成功的 asl 為:

最壞情形下:① 取等號;② 最大的結點數n = 2^h -1;

則h=log2(n+1),因此 ,asl=(n+1)/n log2(n+1)-1

當 n 很大時,asl --> log2(n+1)-1 ,則其時間複雜度為o(log2n)。 

二分查詢的效率比順序查詢高,但只能適用於有序表,而排序本身是一種很費時的運算,即使採用高效率的排序方法也要花費o(nlog2n)的時間;另外,二分查詢只適用於順序儲存結構(對線性鍊錶 表示無法進行二分查詢)

查詢思想:是順序查詢的一種改進方法,就是把被查詢的表分成若干塊,每塊中記錄的存放順序是無序的,但塊與塊之間必須按關鍵字有序。即第一塊中任一記錄的關鍵字都小於第二塊中任一記錄的關鍵字,而第二塊中任一記錄的關鍵字都小於第三塊中任一記錄的關鍵字,依此類推。

該方法要為被查詢的表建立乙個索引表,索引表中的一項對應於表中的一塊,索引表中含有這一塊中的最大關鍵字和指向塊內第乙個記錄位置的指標,索引表中各項關鍵字有序

查詢步驟:

1)折半查詢索引表(當然也可以順序查詢索引表,整體的查詢速度也是比原始的順序查詢高的,但遠不及折半查詢),確定要找的記錄所在塊;

2)在相應的塊中順序查詢。

示例:

**實現:

package search;

public class staticsearch else if(index[0][mid] > key)

high = mid;

else

//index[0][mid] < key

low = mid + 1;

} start = index[1][low];

//從start位置開始順序查詢

int i = 0;

while(i < elemsinblock && st[start+i] != key)

if(i == elemsinblock)

return -1;

else

return start+i;

} public static void main(string args) ,

};//索引表

int st = ;//查詢表

int key = 22;

int result = searchindex(index, st, key);

if(result > -1)

system.out.println("查詢" + key + "成功,在查詢表中的位置是" + result);

else

system.out.println("查詢" + key + "失敗");

key = 6;

result = searchindex(index, st, key);

if(result > -1)

system.out.println("查詢" + key + "成功,在查詢表中的位置是" + result);

else

system.out.println("查詢" + key + "失敗");

演算法分析:設把長度為n的表分成均等的b個子表,每個子表有s個物件,則 b=n/s 。又設表中每個物件的查詢概率相等,子表為1/b,子表內各物件為1/s 。

則順序查詢確定塊的成功asl為:asl1=(b+1)/2+(s+1)/2=(b+s)/2+1

折半查詢確定塊的成功asl為: asl2=log2(b+1)-1+(s+1)/2=log2(1+n/s)+s/2

可見,索引查詢的asl與表的長度n和子表內物件的個數s有關。

資料結構 靜態查詢表

從查詢說起 在英漢字典中查詢某個英文單詞的中文解釋 在新華字典中查詢某個漢字的讀音 含義 在對數表 平方根表中查詢某個數的對數 平方根 郵遞員送信件要按收件人的位址確定位置等等。從計算機 計算機網路中查詢特定的資訊,就需要在計算機中儲存包含該特定資訊的表。查詢是許多程式中最消耗時間的一部分。因而,乙...

資料結構 靜態查詢表

此為本人在學習資料結構時所寫的,各個功能能夠實現,有demo,node.h,tree.h,tree.cpp四個檔案,使用說明如下 按照要求,先進行建樹操作 然後按照輸出的介面選擇查詢操作即可 輸入的資料6 5 4 2 1 3 6。表示建立了一棵二叉鍊錶樹 54 6 21 3 在查詢時輸入 1,則進行...

資料結構 靜態查詢表

順序表與線性鍊錶都可以表示靜態查詢表。兩者的實現靜態查詢表相似,這裡以順序表為例。順序查詢就是從表中最後乙個記錄開始,逐個進行記錄關鍵字與給定值的比較,若某個記錄的關鍵字和給定值比較相等,則查詢成功,反之失敗。對於順序查詢有一種技巧可以優化效率。查詢之前先將key賦值給elem 0 搜尋從後向前搜尋...