資料結構基本查詢演算法

2021-07-10 03:44:59 字數 3347 閱讀 9699

查詢表的概念:由同一型別的資料元素(或者記錄)構成的集合。由於集合中的資料元素之間存在完全鬆散耦合的關係,因此,查詢表是一種非常靈便的資料結構。

查詢表的操作:

a)查詢某個「特定的」資料元素是否在查詢表中

b)檢索某個「特定的」資料元素的各種屬性

c)在查詢表中插入乙個資料元素

d)從查詢表中刪去某個資料元素

查詢表的分類:

按照記錄在表中的位置和它的關鍵字之間的關係查詢表可以分為:靜態查詢表,動態查詢表和hash表。

靜態查詢表和動態查詢表都是記錄在表中的位置和它的關鍵字之間不存在乙個確定的關係。而hash表是記錄在表中的位置和它的關鍵字之間存在乙個確定的關係。

查詢表的定義:

靜態查詢表:僅作查詢和檢索操作的查詢表。

動態查詢表:在查詢過程中同時插入查詢表中不存在的資料元素,或者從查詢表中刪除已存在的某個資料元素,此類表為動態查詢表。

雜湊表: 根據設定的雜湊函式 h(key) 和所選中的處理衝突的方法,將一組關鍵字映象到乙個有限的、位址連續的位址集 (區間) 上,並以關鍵字在位址集中的「映象」作為相應記錄在表中的儲存位置,如此構造所得的查詢表稱之為「雜湊表」。

查詢表的效能分析:

通常把對關鍵字的最多比較次數和平均比較次數作為查詢演算法的兩個基本技術指標,分別叫做最大查詢長度(msl)和平均查詢長度(asl)。

基本思想:從表的一端開始,順序掃瞄線性表,依次將掃瞄到的結點關鍵宇和給定值k相比較。若當前掃瞄到的結點關鍵字與k相等,則查詢成功;若掃瞄結束後,仍未找到關鍵字等於k的結點,則查詢失敗。

**實現

//順序查詢

public

intsearch_seq(int nums,int key)

}//查詢失敗,返回-1

return -1;

}

優缺點:演算法簡單,且對錶的結構無任何要求,無論是用向量還是用鍊錶來存放結點,也無論結點之間是否按關鍵字有序,它都同樣適用;查詢效率低,因此,當n較大時不宜採用順序查詢。

平均查詢長度:(n+1)/2

基本思想:又稱二分查詢,折半查詢是以處於區間中間的位置記錄的關鍵字和給定值進行比較,若相等,查詢成功,若不等,則縮小範圍,直至新的區間中間位置記錄的關鍵字等於給定值或者區間大小小於0時,則查詢失敗。折半查詢只適用於有序表,且限於順序儲存結構,對線性鍊錶無法進行查詢。

**實現

//折半查詢

public

intsearch_bin(int nums,int key) else

if(key < nums[mid]) else

}//未查找到

return -1;

}

優缺點:雖然二分查詢的效率高,但是要將表按關鍵字排序。而排序本身是一種很費時的運算。既使採用高效率的排序方法也要花費o(nlgn)的時間。二分查詢只適用順序儲存結構。為保持表的有序性,在順序結構裡插入和刪除都必須移動大量的結點。因此,二分查詢特別適用於那種一經建立就很少改動、而又經常需要查詢的線性表。對那些查詢少而又經常需要改動的線性表,可採用鍊錶作儲存結構,進行順序查詢。鍊錶上無法實現二分查詢。

平均查詢長度:log2(n+1) -1

基本思想:分塊查詢又稱索引順序查詢,效能介於順序查詢和二分查詢之間。表r[1..n]均分為b塊,前b-1塊中結點個數為 s=n/b(向上取整) ,第b塊的結點數小於等於s;每一塊中的關鍵字不一定有序,但前一塊中的最大關鍵字必須小於後一塊中的最小關鍵字,即表是」分塊有序」的。然後抽取各塊中的最大關鍵字和它們的位置構成索引表,該索引表是遞增有序的。此時,當我們要查詢元素時,可以在索引表上面採用折半查詢(優先)或者順序查詢確定該元素在哪乙個塊中,然後再在塊內使用順序查詢(因為塊中的元素是無序的)。

**實現

分塊查詢

平均查詢長度:log2(n/s+1)+s/2

又稱二叉查詢樹

定義:二叉排序樹或者是空樹,或者是滿足如下性質的二叉樹

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

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

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

操作:(

b-樹是一種平衡的多路查詢樹,在檔案系統中很有用。

定義:一顆m階b-樹或為空樹,或者滿足如下性質

(1)樹中每個節點至多有m棵子樹;

(2)若根節點不是葉子節點,則至少有兩棵子樹;

(3)除根節點之外所有非終端節點至少有m/2向上取整棵子樹;

(4)所有非終端節點中包含下列資訊資料:(n,a0,k1,a1,k2,a2,…,an.kn)其中,n是表示該節點中關鍵字的個數,k為關鍵字,a為指向子樹的指標。ai-1指向的子樹中節點的值都小於ki,ai指向的子樹節點中的值都大於ki;

(5)所有的葉子節點都出現在同一層次上,不帶資訊。可以看做是外部節點或者是查詢失敗所到達的節點。

在b-樹上進行查詢的過程和二叉排序樹的查詢類似。具體過程參考《資料結構》,p238。

概念:根據設定的雜湊函式h(key)和處理衝突的方法,將一組關鍵字映像到乙個有限的連續的位址集(區間)上,並以關鍵字在位址集中的「像」作為記錄在表中的儲存位置。

雜湊函式構造方法:直接定址法,數字分析法,平方取中法,摺疊法,除留餘數法,隨機數法…

處理衝突的方法:開放定址法,再雜湊法,鏈位址法,公共溢位區

雜湊表的查詢:在雜湊表上進行查詢的過程和雜湊表的構造過程基本一致。給定k值,根據造表時設定的雜湊函式求得雜湊位址,若表中的此位置上沒有記錄,則查詢失敗;否則,需要拿給定值與記錄進行比較,若相等,則查詢成功;否則,根據造表時設定的處理衝突的方法找下乙個位址,直到雜湊表中某個位置為空或者表中的記錄與給定值相等為止。

具體過程參考《資料結構》,p251。

資料一資料二《資料結構(c語言版)》嚴蔚敏,吳偉民

資料結構查詢演算法

又叫線性查詢,是一種基本的查詢演算法。查詢過程 從表中第乙個 或最後乙個 記錄開始,逐個進行記錄的關鍵字和給定值比較,若某個記錄的關鍵字和給定值相等,則查詢成功,如果查詢到表中最後乙個元素,還沒有找到,則查詢不成功。public intsearch int array int key return ...

java資料結構和演算法 基本查詢排序

1.二分法查詢 public class binaryfindarray private static int elems arr.length public static int find int searchkey else if low pow else else public static ...

資料結構 查詢演算法(折半查詢)

當乙個順序表的元素是有序排列的,這時我們才可以使用折半查詢。我們查詢的過程是找到中間位置判斷這個位置上的值是不是目標值,若是則直接找到,若不是,判斷中間位置上的值與目標值的大小關係,若是大於目標值說明我們要查詢的目標值在前半部分,小於則說明是在後半部分,然後我們在要找的部分裡面用上面同樣的方式查詢,...