第七章 查詢技術
【學習重點】
1 折半查詢的過程及效能分析;
2 二叉排序樹的插入,刪除和查詢操作;
3 平衡二叉樹的調整方法;
4 雜湊表的構造和查詢方法;
5 各種查詢技術的時間效能及對比。
【學習難點】
1 二叉排序樹的刪除操作;
2 平衡二叉樹的調整方法;
3 閒雜湊表的刪除演算法。
7.1 概述
7.1.1 查詢的基本概念
在查詢問題中,通常將資料元素稱為記錄。
關鍵碼 可以標識乙個記錄的某個資料項稱為關鍵碼,關鍵碼的值稱為鍵值。
查詢 廣義地講,查詢是在具有相同型別的記錄構成的集合中找出滿足給定條件的記錄。
查詢的結果 若在查詢集合中找到了與給定值相匹配的記錄,則稱查詢成功。
靜態查詢 動態查詢 不涉及刪除操作的查詢稱為靜態查詢,涉及刪除操作的查詢稱為動態查詢。
查詢結構
本章討論的查詢結構有:
(1)線性表 (2
)樹表
(3)雜湊表
7.1.2 查詢演算法的技能
對於查詢演算法,以個別關鍵碼的查詢來衡量時間效能是不完全的。一般來講,我們關心的是它的整體效能。將查詢演算法進行的關鍵碼比較次數的數學期望值定義為平均查詢長度。
7.2 線性表的查詢技術
7.2.1 順序查詢
順序查詢又稱線性查詢,是最基本的查詢技術之一。
1. 順序表的順序查詢
在長度為n的順序表中查詢給定值為k的記錄,將哨兵設在陣列的低端,順序查詢演算法用偽**描述如下:
1. 設定哨兵;
2. 初始化查詢的起始下標i=n;
3. 若r[i]與k相等,則返回當前i的值,繼續比較前乙個記錄;
順序查詢演算法的c++
描述如下:
順序表的順序查詢演算法 seqsearch1
int seqsearch1(int r,int n,int k)
r[0]=k;
i=n;
while(r[i]!=k)
i--;
return i;
2.單鏈表的順序查詢
假定帶頭結點的單鏈表的頭指標為first,在單鏈表中的順序查詢演算法如下:
單鏈表的順序查詢演算法 seqsearch2
int seqsearch2(node*first,int k)
p=first->next;cout=1;
while (p!=null&&p->data!=k)
p=p->next;
j++;
if(p->data==k) return j;
else return 0;
7.2.2 折半查詢
相對於順序查詢技術來說,折半查詢技術的要求比較高,它要求線性表中的記錄必須按關鍵碼有序,並且必須採用順序儲存。折半查詢技術一般只能應用於靜態查詢。
1. 執行過程
折半查詢利用了記錄按關鍵碼有序的特點。
折半查詢演算法用偽**描述為:
1. 設定初始查詢區間:low=1;high=n;
2. 測試查詢區間[low,high]
是否存在,若不存在,則查詢失敗;否則
3. 取中間位置mid=(low+high)/2;比較k
與r[mid]
有以下三種情況:
3.1若
k則high=mid-1;
查詢在左半區進行,轉第二步;
3.2若
k>r[mid],
則low=mid+1;
查詢在右半區進行,轉第二步;
3.3若
k=r[mid],
則查詢成功,返回記錄在表中位置
mid;
2. 非遞迴演算法
設有序表的長度為n
,待查值為
k,折半查詢非遞迴演算法的
c++描述如下:
折半查詢非遞迴演算法 binsearch1
int binsearch(int r,int n,int k)
low=1;high=n;
while (low<=high)
mid=(low+high)/2;
if(kelse if(k>r[mid])low=mid+1;
else return mid;
return 0;
3.遞迴演算法
遞迴演算法可以直接依照折半查詢的定義給出。
折半查詢遞迴演算法 binsearch2
int binsearch2(int r,int low,int high,int k)
if(low>high)return 0;
else
i=(j+1)%m;
while (ht[i]!=empty&&i!=j)
if(ht[i]==k)return i;
else i=(i+1)%m;
if(i==j) throw"溢位";
else
當從閉雜湊表中刪除乙個記錄時,有兩點需要考慮:
(1) 刪除乙個記錄一定不能影響以後的查詢;
(2) 刪除記錄後的儲存單元應該能夠為將來的插入使用。
(2)二次探測法
hi=(h(key)+di)%m (di=12,-12,22,-22,….,q2,-q2且
q≤根號m)
(3)隨機探測法
hi=(h(key)+di)%m (di是乙個隨機數列,
i=1,2, ….,m-1)
2. 拉鍊法(鏈位址法)
用拉鍊法處理衝突構造的雜湊表叫做開雜湊表。
在開雜湊表中進行動態查詢的演算法用偽**描述如下:
1.計算雜湊位址j;
2.在第
j個同義詞子表中順序查詢;
3.若查詢成功,則返回結點的位址;
否則,將待查記錄插在第j
個同義詞子表的表頭。
開雜湊表的查詢演算法 hashsearch2
node*hashsearch2(node*ht,int m,int k)
j=h(k);
p=ht[j];
while ((p!=null)&&(p->data!=k))
p=p->next;
if(p->data==k) return p;
else{
q=new node;q->data=k;
q->next=ht[j];ht[j]=q;
在用拉鍊法處理衝突的雜湊表中刪除乙個記錄,只需在相應單鏈表中刪除乙個結點。
7.4.4 雜湊查詢的效能分析
在查詢過程中,關鍵碼的比較次數取決於產生衝突的概率。產生的衝突越多,查詢效率就越低。影響衝突產生的概率有以下三個因素。
(1)雜湊函式是否均勻。 (2
)處理衝突的方法。 (3
)雜湊表的裝填因子。
在很多情況下,雜湊表的空間都比查詢集合打,此時雖然浪費了一定的空間,但換來的是查詢效率。
7.4.5 開雜湊表與閉雜湊表的比較
開雜湊表與閉雜湊表的比較類似於單鏈表與順序表的比較。
由於開雜湊表中各同義詞子表的表長是動態變化的,無須事先確定表的容量(開雜湊表由此得名);而閉雜湊表卻必須事先估計容量。因此,開雜湊表更適合於事先難以估計容量的場合。
思想火花——把注意力集中於主要因素,不要糾纏於雜訊
資料結構 第七章 查詢技術
第七章 查詢技術 學習重點 1 折半查詢的過程及效能分析 2 二叉排序樹的插入,刪除和查詢操作 3 平衡二叉樹的調整方法 4 雜湊表的構造和查詢方法 5 各種查詢技術的時間效能及對比。學習難點 1 二叉排序樹的刪除操作 2 平衡二叉樹的調整方法 3 閒雜湊表的刪除演算法。7.1 概述 7.1.1 查...
資料結構第七章查詢
判斷題 1 1在雜湊中,函式 插入 和 查詢 具有同樣的時間複雜度。t 1 2當記錄個數小於雜湊表長度時,雜湊查詢平均查詢長度必然為0。f 1 3用向量和單鏈表表示的有序表均可使用折半查詢方法來提高查詢速度。f 1 4有n個數存放在一維陣列a 1 n 中,在進行順序查詢時,這n個數的排列有序或無序其...
資料結構 第七章 查詢
查詢的目的是從給定的同一型別的資料集合中,找出人們所需要的資料元素 或記錄 基本術語 記錄 record 關鍵字 keyword 主關鍵字 primarykey 次關鍵字 secondary key 查詢表 searching table 動態查詢 dynamic searching 靜態查詢 st...