概念
- 檢索表:待查找的數據容器,例如線性表、樹表(樹、二叉樹、B/B+樹)等
- 關鍵字:key
- 關鍵字值:key對應的value
- 檢索/查找:Search
1. 線性表的檢索
1.1 順序檢索
可用於所有線性表,包括順序表和鏈表。
1.2 二分法檢索
只能用於順序表(數組)。
1.2.1 黃金分割點檢索
與二分法檢索類似,但是分割檢索區間的方式不同;二分法以二等分的方式分割檢索區間,黃金分割點以0.618比例方式分割檢索區間
1.3 精算點檢索
如果檢索表是有序而且分佈均勻的,可通過計算估算檢索位置。只能用於順序表。
1.3 分塊檢索
是順序檢索的一種改進方法。效率介於順序檢索和二分查找之間。分塊檢索不要求檢索表中所有記錄關鍵字有序排列,但要求把檢索表分成若干塊,並且各塊之間按key大小有序。即塊間有序、塊內無序。
1.4 跳躍表
又叫跳錶,一種基於有序鏈表的擴展,具有二分查找的查找效率,又具有鏈表的插入/刪除效率。
2. 樹表的檢索
2.1 二叉檢索樹/二叉查找樹(BST:Binary Search Tree)
- 是一個二叉樹
- 左子樹不空,則左子樹上所有結點的值小於根結點的值
- 右子樹不空,則右子樹上所有結點的值大於根結點的值
- 查找時比較次數不超過樹的深度
2.1.1 平衡二叉樹/AVL樹
平衡因子的絕對值不超過1的二叉樹(網上查到都是說平衡二叉樹是二叉檢索樹)。
平衡因子:該結點的左子樹深度減去右子樹深度的差
- 插入或刪除結點可能導致不平衡,需要調整
2.2 B樹/B+樹
B樹是一種平衡的多路檢索樹(平衡N叉檢索樹)
B樹的特點:
- 一個結點最多有N-1個鍵(key)
- 一個結點最多有N棵子樹
- 除根結點外,所有非終端結點至少有[N+1/2]棵子樹
B+樹的特點:
- 是一種B樹的變形樹
- 有n棵子樹的結點含有n個鍵(key)
- 節點的每個鍵是對應子樹的最大(或最小)鍵
- 所有葉子結點包含了全部鍵的信息
3. 哈希檢索
前兩種檢索方式,鍵在檢索表中的位置都是隨機的,或者說是相對的,與其鍵(key)不存在某種確定的關係。
哈希檢索是一種直接利用鍵來確定記錄在檢索表中位置的技術。
- 哈希函數
- 哈希地址衝突(collision)
3.1 地址衝突的消解策略
在數據插入時,可能發生插入的位置已經存在數據,即有地址衝突。如何解決這個問題?
3.1.1 開發定址法
從插入的位置開始,查找一個最近的空地址用於存儲記錄。
- 線性探查法
將哈希表看作是環形表,從當前地址往後查:(d+1)%m、(d+2)%m…,m爲哈希表的長度 - 平方查找法
以(d+i)%m的方式查,i取值:12 , -12 , 22 , -22 … - 隨機探查法
選取隨機數作爲地址位移來計算下一個地址
3.1.2 拉鍊法
將哈希地址相同的鍵的記錄鏈接到同一個單鏈表中。