第7章學習小結

2022-08-30 14:00:27 字數 2773 閱讀 7837

查詢分為線性表的查詢、樹表的查詢、雜湊表的查詢。

一些定義:

查詢表:由同一型別的資料元素(或記錄)構成的集合(在查詢時對錶做修改操作,如插入和刪除,則稱為動態查詢表;否則稱為靜態查詢表)

關鍵字:資料元素(或記錄)中某個資料項的值(如果乙個查詢表裡只儲存了關鍵字,意義不是很大

平均查詢長度asl:從1到第n個資料元素  查詢第 i 個記錄的概率 * 找到第 i 個記錄所需的比較次數  之和

型別定義

//

資料元素型別定義

typedef struct

elemtype ;

//順序表的定義

typedef struct

sstable ;

一、線性表的查詢

順序查詢

(1)順序查詢方法既適用於線性表的順序儲存結構,又適用於線性表的鏈式儲存結構,表內元素不要求有序。

(2)空間複雜度:o(1)

時間複雜度:o(n)

查詢成功時(設表中每個記錄的查詢概率相等),asl = (1+2+...+n)/ n = (n+1)/ 2

查詢不成功時,asl = n+1

int

search_seq(sstable st, keytype key)

(3)優點:演算法簡單,對錶結構無任何要求,既適用於順序結構,也適用於鏈式結構,無論記錄是否按關鍵字有序均可應用。

缺點:平均查詢長度較大,查詢效率較低,所以當 n 很大時,不宜採用順序查詢。

折半查詢

(1)折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列

(2)空間複雜度:o(1)

時間複雜度:o(log2n)

int

search_bin(sstable st, kettype key)

return

0 ; //

表中不存在待查元素

}

//

遞迴演算法

int search_bin(sstable st, keytype key, int low, int

high)

(3)優點:比較次數少,查詢效率高。

缺點:對錶結構要求高,只能用於順序表儲存的有序表

適合一次排序,多次查詢。因此,針對有序且靜態資料(在動態資料集合中,考慮樹查詢)

資料量小,不需要二分(陣列:連續記憶體空間)

資料量太大也不可以用二分

分塊查詢(塊內無序,塊間有序)

(1)分塊查詢的平均查詢長度為 asl = 查詢索引表確定所在塊的平均查詢長度 + 在塊中查詢元素的平均查詢長度

(2) 優點:快速查詢 + 動態變化

缺點:要增加乙個索引表的儲存空間並對初始索引表進行排序

二、樹表的查詢

二叉排序樹:若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值

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

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

或者是空樹

(中序遍歷一棵二叉樹時可以得到乙個結點值遞增的有序排列)

//

二叉排序樹的二叉鍊錶儲存表示

typedef struct

elemtype ;

typedef

struct

bstnode

bstnode, *bstree ;

//二叉排序樹的遞迴查詢

bstree searchbst(bstree t, keytype key)

(1)時間複雜度:最好的情況(類似於折半查詢):log2n

最壞的情況(類似於順序查詢):(n + 1) / 2

平衡二叉樹:左子樹和右子樹的深度之差的絕對值不超過1

左子樹和右子樹也是平衡二叉樹

或者是空樹

平衡因子:該結點左子樹和右子樹的深度之差,則平衡二叉樹上所有結點的平衡因子只可能是-1,0,1

平衡調整方法:保持有序+平衡

b+樹、b-樹:多叉樹

三、雜湊表的查詢

雜湊表:乙個有限連續的位址空間。通常雜湊表的儲存空間是乙個一維陣列,雜湊位址是陣列的下標。

衝突:不同的關鍵字得到同一雜湊位址

同義詞:具有相同函式值的關鍵字

(1)雜湊函式的構造方法:數字分析法、平方取中法、摺疊法、除留餘數法

(2)處理衝突的方法:開放位址法(線性探測法、二次探測法、偽隨機探測法)

鏈位址法(把具有相同雜湊位址的記錄放在同乙個單鏈表中,稱為同義詞鍊錶)

//

開放位址法雜湊表的儲存表示

#define m 20 //

雜湊表的表長

typedef

struct

hashtable[m] ;

//雜湊表的查詢

#define nullkey 0 //

單元為空的標記

intsearchhash(hashtable ht, keytype key) //

forreturn -1

; }

//else

}

(3)裝填因子:表中填入的記錄數 / 雜湊表的長度

(越大說明表中已填入的記錄越多,發生衝突的可能性就越大)

(4)在查詢概率相等的前提下,

平均長度 asl = (1/n) * ci ( i = 1, 2, 3, 4...) (

n為雜湊表中記錄的個數,ci為成功查詢第 i 個紀錄所需的比較次數)

第7章學習小結

一 線性表的查詢 1 順序查詢 typedef keytype int 這個根據具體情況去定義 在這裡定義為int typedef structelemtype typedef struct sstable 查詢過程 按順序乙個乙個比對,直到找到為止 若全部對比完都沒找到,則意味著查詢失敗。設定哨兵...

第7章學習小結

在第七章我們學習了查詢演算法 查詢主要包括三種結構 線性表 樹表 雜湊表 一 線性表 順序查詢 折半查詢 分塊查詢 查詢時間複雜度 o n o log2n asl l查塊 l塊內查詢 特點毫無特點 效率高一點點咯 甚至不如折半查詢 通用情況 任何結構都行 有序的順序表 塊間有序 塊內無序的順序表 二...

Arc Engine開發第7章小結

gis的顯示內容主要是各種要素構成,在實際應用中,經常需要捕獲地圖上的要素。地圖互動物件 displayfeedback,可以實現移動旋轉節點編輯等重要功能。在第七章的例程中,由於第七章所提供的地 檔出現問題,導致整個程式無法執行,但是又找不到原有的可以替代的地 檔,這個就這樣先過去了 privat...