查找算法進階:利用樹的查找(二叉排序樹、AVL樹、多路查找樹、B樹)

本篇博客旨在學習查找算法。
最重要的四種查找算法:順序查找、二分查找、哈希表查找、二叉排序樹查找。
從二叉排序樹可見,使用樹這一結構,可以實現動態查找的高效率。

1 二叉排序樹

二叉搜索樹,顧名思義是一個二叉樹,那麼就有二叉樹的優勢:查找迅速、插入和刪除不用移動元素。
現在我們需要對他做中序遍歷時,得到有序的序列

1.1 性質

1、若他的左子樹不空,則左子樹所有結點的值小於根節點的值;
2、若他的右子樹不空,則右子樹所有結點的值大於根節點的值;
3、左右子樹分別也都是二叉排序樹;

1.2 操作

1、搜索:遞歸進行如下操作:如果查找關鍵字小於當前結點值,則在左子樹繼續查找;如果查找關鍵字大於當前結點值,則在右子樹繼續查找。遞歸終止條件:如果查找關鍵字等於當前結點值,則查找成功;或如果查找關鍵字不等於當前結點值且已經到了葉子結點,則查找失敗。當然,如果沒有根結點也是查找失敗的情況。
2、插入:插入操作應該街上前面查找失敗進行,此時創建一個結點。如果查找關鍵字小於當前結點值,則插入該結點作爲左孩子;如果查找關鍵字大於當前結點值,則插入該結點作爲右孩子。
3、刪除:共有三種情況,對於待刪除結點是葉子結點的情況,直接刪去即可;對於待刪除結點只有左子樹或只有右子樹的情況,直接將該子樹放在原結點位置即可;但對於待刪除結點有左子樹並且有右子樹的情況,就非常麻煩了,這時最簡單的方法是找到刪除結點的前驅和後繼,也就是排序後最接近刪除結點值的兩個數字,可以選擇將他們中的一個替換到刪除結點的位置上。

1.3 優化

二叉排序樹的形狀是不固定的,因此會有全位於左子樹或右子樹的極端情況,同鏈表。因此我們更希望二叉搜索樹是平衡的,即左右子樹深度比較接近的。因此,下面的平衡二叉樹就是對它的優化

2 平衡二叉樹(AVL數)

平衡二叉樹首先是一棵平二叉排序樹,並且在此基礎上,每一個結點的左子樹和右子樹的高度差至多爲1.。總體來說,AVL樹是將二叉排序樹的不平衡消滅在最早時刻的樹。

2.1 相關概念

1、平衡因子:二叉樹結點左子樹深度減去右子樹深度的值。
2、平衡二叉樹:所有結點的平衡因子絕對值都不大於1的樹。
3、最小不平衡子樹:距離插入結點最近,且平衡因子絕對值大於1的結點爲根的子樹。

2.2 實現原理

1、基本思想:插入一個結點時就檢查是否破壞了樹的平衡性,如果破壞了,則找出最小不平衡子樹,進行左旋或右旋或交換位置,使其變得平衡。
2、右旋:平衡因子大於1時,將樹順時針旋轉,更改根結點爲中間的結點;
3、左旋:平衡因子小於-1時,將樹逆時針旋轉,更改根結點爲中間的結點;

2.3 複雜度

1、查找操作的時間複雜度:O(logn)
2、插入和刪除操作的時間複雜度:O(logn)

2.4 一點引申

關於STL中的關聯容器,是基於紅黑樹來完成的,其效果和二叉排序樹非常相似,兩者也各自有各自的優勢,因此map和set常用操作的時間複雜度也均約等於O(logn)

3 多路查找樹

每一個結點孩子數可以多於2個,且每個節點可以存儲多個元素來應對大數量元素,一般用於外存的查找,如硬盤。

3.1 2-3樹

1、每個結點可以具有2個孩子(稱爲2結點)或3個孩子(稱爲2結點)或0個孩子;
2、2結點包含1個元素和2個孩子,3結點包含1個元素和3個孩子,他們可以沒有孩子但不能孩子數不夠;
3、有二叉排序樹的性質:左子樹均小於該元素,右子樹均大於該元素,中間子樹元素位於兩者之間;

3.2 2-3-4樹

是2-3樹的擴展,一個4結點包含3個元素和4個孩子(也可能是沒有);

4 平衡的多路查找樹(B樹)

B樹即平衡的多路查找樹,其比多路查找樹增加了一個關鍵字項,使其知道該結點有多少個元素。
查找過程:順時針查找結點+在結點查找關鍵字。

4.1 B樹

1、每個非根的分支結點都有k-1個元素和k個孩子
2、所有葉子結點都在同一層級(每個子樹深度相同);
3、最大孩子數目爲m的,具有n個關鍵字的B樹,最壞情況下涉及的結點數爲以m/2爲底(n+1)/2的對數。

4.2 B+樹

爲了避免中序遍歷導致的多次訪問同一個父節點,,出現在分支結點的元素會被當做他們在分支結點的中序後繼者在此列出,且每個葉子結點都會保存一個指向後一葉子結點的指針。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章