查找
根據某個給定關鍵字K,從集合R中找出關鍵字與K相同的記錄
- 靜態查找:集合中記錄是固定的,沒有插入和刪除操作,只有查找
- 動態查找:集合中記錄是動態變化的,除查找,還可能發生插入和刪除
靜態查找
順序查找
int SequentialSearch(StaticTable *Tbl, ElementType K) {
int i;
for (int i = 0; i < Tbl->Length; i++) {
if (Tbl->Element[i] == K)
return i;
}
return -1;
}
順序查找算法的時間複雜度爲
二分查找(Binary Search)
假設n個數據元素的關鍵字滿足有序(比如:小到大)
k_1 \le k_2 \le ... \le k_n
並且是連續存放(數組),那麼可以進行二分查找
代碼實現
int BinarySearch(StaticTale *Tbl, ElementType K) {
int left, right, mid, NotFound = -1;
left = 0; // 初始左邊界
right = Tbl->Length - 1; // 初始右邊界
while (left <= right) {
mid = (left + rigth) / 2; // 計算中間元素座標
if (k < Tbl->Element[mid]) // 調整右邊界
right = mid - 1;
else if (k > Tbl->Element[mid]) // 調整左邊界
left = mid + 1;
else
return mid; // 查找成功,返回下標
}
return NotFound; // 查找失敗,返回-1
}
二分查找算法具有對數的時間複雜度
二分查找判定樹
進行二分查找的時候,元素會構成一個二分查找判定樹:
* 判定樹上每個結點需要的查找次數剛好爲該結點所在的層數
* 查找成功時查找次數不會超過判定樹的深度
* n個結點的判定樹深度爲
樹(Tree)
定義
n(n≥0) 個結點構成的有限集合- 當
n=0 時,稱爲空樹 - 對於任一棵非空樹
(n≥0) ,它具備以下性質:
- 樹中有一個稱爲“根(Root)”的特殊結點,用r表示
- 其餘結點可分爲
m(m≥0) 個互不相交的有限集T1,T2,...,Tm ,其中每個集合本身又是一棵樹,稱爲原來樹的“子樹(SubTree)” - 子樹是不相交的
- 除了根結點外,每個結點有且僅有一個父節點
- 一棵
N 個結點的樹有N−1 條邊
基本術語
- 結點的度(Degree):結點的子樹個數
- 樹的度:樹的所有結點中最大的度數
- 葉結點(Leaf):度爲0的結點
- 父節點(Parent):有子樹的結點是其子樹的根結點的父結點
- 子結點(Child):若A結點是B結點的父結點,則稱B結點是A結點的子結點。子結點也稱孩子結點
- 兄弟結點(Sibling):具有同一父結點的各結點彼此是兄弟結點
- 路徑和路徑長度:從結點
n1 到nk 的路徑爲一個結點序列n1,n2,...,nk ,ni 是ni+1 的父結點。路徑所包含邊的個數爲路徑的長度 - 祖先結點(Ancestor):沿樹根到某一結點路徑上的所有結點都是這個結點的祖先結點
- 子孫結點(Descendant):某一結點的子樹中所有結點是這個結點的子孫
- 結點的層次(Level):規定根結點在1層,其它任一結點的層數是其父結點的層數加1
- 樹的深度(Depth):樹中所有結點中的最大層次是這棵樹的深度