一、二分查找法
二分查找法(binary search)也成為折半查找法。用來查找一組有序的記錄組中的某一記錄。
基本思想是:將記錄按有序化(遞增或遞減)排列,在查找過程中采用跳躍式方法查找,即先以有序數列的中點位置為比較對象,如果要找的元素值小於該中點元素,則將待查詢列縮小為左半部分,否則為右半部分。通過一次比較,將查詢區間縮小一半。
如有5,10,19,21,31,37,42,48,50,52這10個數,要查48這個數,其查找過程:
從圖看,用了3次就找到了48這個數。如果是順序查找,則需要8次,因此二分查找法的效率比順序查找法要好(平均)。但是如果要查5這個數,順序查只需1次,而二分查找需要4次。
對於上面的10個數來說,平均查找次數為(1+2+3+4+5+6+7+8+9+10)/10=5.5次。而二分查找為(4+3+2+4+3+1+4+3+2+3)/10=2.9次。
在最壞的情況下,順序查找的次數為10,而二分查找法為4
二、二叉查找樹和平衡二叉樹
B+樹是通過二叉查找樹,再由平衡二叉樹,B樹演化而來。
二叉查找樹中定義:左子樹的鍵值總是小於根的鍵值,右子樹的鍵值總是大於根的鍵值。因此可以通過中序遍歷得到鍵值的排序輸出
若想最大性能的構造一顆二叉查找樹,需要這顆二叉查找樹是平衡,從而引出了新的定義-----平衡二叉樹,或稱為AVL樹。
平衡二叉樹定義:首先復合二叉查找樹的定義,其次必須滿足任何節點的兩個子樹的高度最大差為1.
平衡二叉樹的查詢速度很快,但是維護一顆平衡二叉樹的代價很大,通常來說,需要1次或多次左旋和右旋來得到插入或更新后樹的平衡性。如下所示:
三、B+樹
B+樹和二叉樹、平衡二叉樹一樣都是經典的數據結構。
B+樹由B樹和索引順序訪問方法(ISAM,這就是MyISAM引擎最初參考的數據結構)演化而來,實際中已經沒有使用B樹的情況了。
B+樹是為磁盤或其他直接存儲輔助設備設計的一種平衡查找時。
B+樹中,所有記錄節點都是按鍵值的大小順序存放在同一層的葉子節點上,由各葉子節點指針進行連接。
如下:其高度為2,每頁存放4條記錄,扇出(fan out)為5。所有記錄都在葉子節點上,並且是順序存放的。
四、B+樹的插入操作
B+樹的插入必須保證插入后葉子節點中的記錄依然排序,同時需要考慮插入到B+樹的三種情況,每種情況都會導致不同的插入算法。如下所示:
1、如下圖這顆B+樹,若用戶插入28這個值,發現當前葉子頁leafPage和IndexPage索引頁都沒有滿,直接插入就行。
圖(1)
圖(2)
2、從上圖接着插入70這個鍵值,這時原來的leafPage已經滿了,但是IndexPage還沒有。這時插入leafPage后的情況為50、55、60、65、70,並根據中間值60來拆分葉子節點,可得下圖。
圖(3)
為了保持平衡對於新插入的鍵值可能需要做大量的拆分頁(split)操作。因為B+樹結構主要用於磁盤,也拆分意味着磁盤操作,所以應該在可能的情況下盡量減小頁的拆分操作。因此B+樹會提出平衡二叉樹的旋轉(Rotation)功能。
旋轉發生在leafPage已滿,但是其左右兄弟節點沒有滿的情況下。這時B+樹不會急於去拆分頁操作,而是將記錄移到所在頁的兄弟頁節點上,通常情況下,左兄弟會被首先檢查用來做旋轉操作。若如此,插入70應該左旋為:
圖(4)
3、最后插入95,這時復合第三種情況,即leafPage和IndexPage都滿了,這時需要做兩次拆分
圖(5)
五、B+樹的刪除操作
B+樹使用填充因子(fill factor)來控制樹的刪除變化,50%是填充因子可設的最小值。
B+樹的刪除操作同樣必須保證刪除后葉子節點中的記錄依然排序,同插入一樣,B+樹刪除操作同樣需要考慮以下三種情況:
1、根據圖(5)的B+樹來進行刪除。首先刪除鍵值為70的記錄:
接着刪除鍵值為25的記錄,但是該值還是IndexPage中的值,因此在刪除LeafPage中的25后,還應將25的右兄弟節點28更新到PageIndex中,如圖:
最后刪除60這個鍵值。刪除LeafPage中鍵值為60的記錄后,Fill Factor小於50%,這時需要做合並操作,同樣,在刪除IndexPage中相關記錄后需要做IndexPage的合並操作。