資料結構-第七章 學習小結
一、本章思維導圖
二、知識點
1、順序查詢
(1)普通的順序查詢
(2)設定監視哨的順序查詢
int search(SSTable ST, KeyType key) { for(i=ST.length;i>=1;--i) if(ST.R[i].key==key) return i; //從後往前找 return 0; }普通順序查詢程式碼
int search(SSTable ST, KeyType key) { ST.R[0].key==key; //"哨兵" for(i=ST.length;ST.R[i].key!=key;--i); //設定監視哨的順序查詢程式碼從後往前找 return 0; }
2、折半查詢
int search(SSTable ST, KeyType key) { low=1; high=ST.length; while(low<=high) { mid=(low+high)/2; if(key==ST.R[mid].key) return mid; //找到待查元素 else if(key<ST.R[mid].key) high=mid-1; //繼續在前一子表進行查詢 else low=mid+1折半查詢程式碼; // 繼續在後一子表進行查詢 } return 0; //表中不存在待查元素 }
適合折半查詢的資料量分析:
資料量太小不適用,直接用順序查詢即可;
資料量太大也不適用,資料元素儲存在陣列中,若資料量太大會超出記憶體課連續空間。
3、分塊查詢(索引順序查詢)
塊間有序,塊內無序。
索引表(關鍵字項和指標項)
ASL=Lb+Lw=[1/2(n/s)+s]+1,其中Lb為查詢索引表確定所在塊的平均查詢長度,Lw為在塊中查詢元素的平均查詢長度,s為塊內的記錄個數。
4、二叉排序樹
(1)二叉排序樹定義:
二叉排序樹或者是空樹或者是具有下列性質的二叉樹:
- 若它的左子樹
- 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值。
- 它的左、右子樹也分別為二叉排序樹。
- 若它的左子樹
(2)二叉樹的查詢演算法
BSTree SearchBST(BSTree T, KeyType key) {//二叉排序樹查詢 if((T==NULL) || key==T->data.key) return T; //查詢結束 else if(key < T->data.key) return SearchBST(T->lchild, key); //在左子樹中繼續查詢 else return SearchBST(T->rchild, key); //在右子樹中繼續查詢 }查詢(遞迴)
5、散列表(雜湊表)
(1)雜湊函式的構造方法
- 數字分析法:從關鍵字中提取分佈均勻的若干位或他們的組合作為地址。
適用情況:事先必須明確知道所有關鍵字每一位上各種數字的分佈情況。
- 平方取中法:取關鍵字平方後的中間幾位或其組合作為雜湊地址,則使隨機分佈的關鍵字得到的雜湊地址也是隨機的。
適用情況:不能事先了解關鍵字的所有情況,或難於直接從關鍵字中找到取值較分散的幾位。
- 摺疊法:
適用情況:適用於雜湊地址的位數較少,而關鍵字的位數較多,且難於直接從關鍵字中找到取值較分散的幾位。
- 除留餘數法:H(key)=key%p;選取適當的p,一般情況下,p為小於表長的最大質數
適用範圍廣,計算簡單,是常用的構造雜湊函式的方法。不僅可以對關鍵字取模,也可以在摺疊、平方取中等運算後取模。
(2)處理衝突方法
開放地址法:Hi=(H(key)+di)%m
線性探測法:di=1,2,3,...,m-1
二次探測法:di=di = 12,-12,22,-22,32,-32,… +k2,-k2(k<=m/2)
偽隨機探測法:di= 偽隨機數序列
鏈地址法:
散列表:
(3)總結:
- 雜湊表技術具有很好的平均效能,優於一些傳統技術
- 鏈地址法優於開地址法
- 除留餘數法作為雜湊函式優於其他型別函式
6、各種比較
(1)平均查詢長度比較
(2)順序查詢、折半查詢和分塊查詢的比較
(3)折半查詢和二叉排序樹查詢的比較
三、分享資料:
平衡二叉樹的平衡調整:平衡二叉樹(樹的旋轉),我覺得這篇部落格寫得很清楚,當時聽完課懵懵的,看完清晰了,裡面還附有例項幫助理解。
B-樹和B+樹:B樹和B+樹的插入、刪除圖解,這篇部落格也可以幫助你理解B-樹和B+樹。