查詢分為線性表的查詢、樹表的查詢、雜湊表的查詢。
一些定義:
查詢表:由同一型別的資料元素(或記錄)構成的集合(在查詢時對錶做修改操作,如插入和刪除,則稱為動態查詢表;否則稱為靜態查詢表)
關鍵字:資料元素(或記錄)中某個資料項的值(如果乙個查詢表裡只儲存了關鍵字,意義不是很大
平均查詢長度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
intsearch_seq(sstable st, keytype key)
(3)優點:演算法簡單,對錶結構無任何要求,既適用於順序結構,也適用於鏈式結構,無論記錄是否按關鍵字有序均可應用。
缺點:平均查詢長度較大,查詢效率較低,所以當 n 很大時,不宜採用順序查詢。
折半查詢
(1)折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列
(2)空間複雜度:o(1)
時間複雜度:o(log2n)
intsearch_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...