第九章 查找
9.1 靜態查找表
查找表:
由同一類型的數據元素構成的集合,可利用任意數據結構實現。鬆散的關係。
關鍵字:
可以標識列表中的一個或一組數據元素,若只能標識唯一的關鍵字則稱爲主關鍵字,反之稱爲次關鍵字
查找:
- 查找對象
- 查找範圍
- 查找位置
查找的操作:
1.查找數據元素是否存在
2.檢索數據元素的屬性
3.在查找表中插入一個數據元素
4.刪除一個數據元素
查找的方法:
- 比較式查找法
- 計算式查找法
平均查找長度:
9.1.1順序表的查找
typedef struct student{
KeyType key;
}ElemType;
typedef struct{
ElemType *elem;
int length;
}ST;
//查找過程
//在順序表ST中順序查找其關鍵字等於key的元素,若找到,則函數值爲該元素在表中的位置,否則爲0
//EQ(a,b)函數是比較兩個元素是否相等
int Search_Seq(SSTable ST, KeyType key){
ST.elem[0].key = key;
int i;
for(i = ST.length; !EQ(ST.elem[i].key, key); --i);
return i;
}
性能分析:
9.1.2有序表的查找
//二分查找
int Search_Bin(SSTable ST, KeyType key){
int low = 1, high = ST.length;
while(low<=high){
mid = (low+high)/2;
if(ST.elem[mid].key==key){
return mid;
}else if(ST.elem[mid].key>key){
high = mid - 1;
}else{
low = mid + 1;
}
}
return 0;
}
9.1.4索引順序表的查找
塊內無序,塊間有序
分塊查找基本過程
- 找到塊
- 順序查找法
9.2 動態查找表
9.2.1二叉排序樹和平衡二叉樹
二叉排序樹或者是一顆空樹,或者是具有如下性質的二叉樹:
-
若它的左子樹非空,則左子樹上所有結點的值均小於根節點的值
-
若它的右子樹非空,則右子樹上所有結點的值均大於根節點的值
-
他的左右子樹也分別爲二叉排序樹
ps:二叉排序樹又稱二叉查找樹
1.二叉排序樹的插入與生成:
- 先與根節點進行比較,比根節點小的往左子樹比較,反之往右子樹比較
- 在與子樹的根節點進行比較,反覆這個過程
- 發現當前根節點的左子樹或者右子樹爲空,則插入到對應位置
2.二叉排序樹元素的刪除:
方法一:
- 刪除操作首先要查找該節點是否存在,在哪個位置
- 若p爲葉子節點,則可以直接刪除
- 若p節點只有左子樹,或只有右子樹,則可將p的左子樹或右子樹直接改爲其雙親結點f的左子樹
- 若p節點既有左子樹又有右子樹,此時有兩種處理方法:
- 首先找到p節點在中序遍歷序列中的直接前驅s節點(s節點肯定沒有右子樹)
- 然後將p的左子樹改爲f的左子樹,而將p的右子樹改爲s的右子樹
方法二:
- 找到p節點在中序序列中的直接前驅s節點
- 用s節點的值替代p節點的值
- 將s節點刪除
- 原s節點的左子樹改爲s的雙親節點q的右子樹
3.二叉排序樹的查找
就是二分查找
4.二叉排序樹的查找性能
平衡二叉排序樹:
- 左子樹與右子樹的高度之差的絕對值小於等於1(平衡因子絕對值小於等於1)
- 左子樹和右子樹也是平衡二叉排序樹
若插入元素到右子樹上,那麼應該逆時針轉