2-3-4樹是一種階為4的B樹。它是一種自平衡的資料結構,可以在O(lgn)的時間內尋找、插入和刪除,這裡的n是樹中元素的數目。2-3-4樹和紅/黑樹狀結構是等價的,也就是每個紅/黑樹狀結構都可以轉化為一顆2-3-4樹,每個選擇操作也和2-3-4樹中的分裂操作對應。
2-3-4樹是這樣一種資料結構,滿足如下性質:
1) 每個節點每個節點有1、2或3個key,分別稱為2-node,3-node,4-node。
2) 每個節點的keys把區間進行了劃分,以4-nde為例,key1、key2、key3分別夾在subtree1, subtree2和subtree2, subtree3和subtree3, subtree4之間。
3) 4-node的子節點不能是4-node。
如所示:
搜尋:
1. 從root開始
2. 比較當前節點的值
2.1 如果找到,就返回當前節點
2.2 如果沒有找到,就找出要搜尋的值屬於哪一個子樹
3. 遞迴的搜尋子樹
在插入和刪除的關鍵是維持性質3),即4-node的節點不能是4-node
插入Key
1.遞迴搜尋Key
1.1 如果root是4-node(ABC),則建一個新的root(B),A,C成為它的兩個子樹
1.2 向下搜尋, 對於中途經過的每一個node, 如果它是4-node則使用如的變換分拆(注意到根據假設演算法不會產生4-node的子節點是4-node, 所以這個操作總是能進行的)
1.3 如果相應的key已存在, 則演算法結束, 不需要插入
2. 注意到如果key不存在, 則1的遞迴搜尋一定停在分葉節點
3. 在當前的分葉節點插入
3.1 如果是2-node或3-node, 則插入當前節點把它變成3-node或4-node, 演算法結束
3.2 如果是4-node, 則根據假設, 它的父節點一定不是4-node(即是2-node或者3-node)
3.2.1 使用與1.2相同的變換分拆4-node
3.2.2 插入相應節點(, 一定是2-node)
要證明2-3-4上面的出入演算法一定形成一個平衡樹,即從root開始往下到任一個葉子的長度都是相等。
用數學歸納法:
1. 只有一個節點的樹當然是平衡的
2. 假設插入了n個元素,樹還是平衡的,現在插入一個新元素,要證明不會破壞平衡性:
演算法會改變tree的是1.1, 1.2, 3.1, 3.2。顯然1.2, 3.1, 3.2都不會改變樹的深度,考慮1.1,它令樹的路徑深度增加1,原來的樹是平衡的,深度增加後當然還是平衡的。
有n個元素的2-3-4樹的深度的粗數量級估計;最壞情況全是2-node,則深度是logn,最好情況全是4-node,深度為logn/2,故:
logn/2 < depth ≤ logn(左邊括弧是不可能的,因為不存在4-node的子節點是4-node)