技術問答
技術文章
iT 徵才
Tag
聊天室
2024 鐵人賽
登入/註冊
問答
文章
Tag
邦友
鐵人賽
搜尋
2024 iThome 鐵人賽
DAY
26
0
佛心分享-刷題不只是刷題
[30天LeetCode挑戰] 每天一點演算法,讓技巧融會貫通
系列 第
26
篇
[Day26] 2-3-4樹 筆記
16th鐵人賽
很懶欸
2024-10-10 18:04:48
111 瀏覽
分享至
2-3-4 樹筆記
基本定義
2-3-4 樹
是一種
自平衡多路搜尋樹(Balanced Multi-Way Search Tree)
,每個節點最多可以包含 2、3 或 4 個子節點,因此命名為 2-3-4 樹。
2-3-4 樹的節點有以下三種類型:
2-節點
:包含 1 個鍵與 2 個子節點。
3-節點
:包含 2 個鍵與 3 個子節點。
4-節點
:包含 3 個鍵與 4 個子節點。
鍵值大小順序規則
:
所有左子樹的鍵值小於父節點的第一個鍵值。
中間子樹的鍵值介於父節點的兩個鍵值之間。
右子樹的鍵值大於父節點的第二個鍵值。
特點
2-3-4 樹是一種
完全平衡樹
,所有葉節點在同一層,樹的高度盡量保持最低,以便在最壞情況下仍能保證
O(log n)
的操作效率。
與其他平衡樹相比,2-3-4 樹因其節點可以容納多個鍵值,所以在插入與刪除時,調整的次數比 AVL 樹或紅黑樹少。
操作時間複雜度
搜尋(Search)
:
O(log n)
插入(Insert)
:
O(log n)
刪除(Delete)
:
O(log n)
常見操作
插入(Insertion)
從根節點開始
:
若根節點是 4-節點,則先分裂根節點,將中間鍵值提升,然後繼續插入。
找到適當的子樹位置
:
按照鍵值大小找到合適的子樹進行遞迴搜索。
處理 4-節點
:
當遇到 4-節點時,將該節點進行分裂,將中間的鍵值提升到父節點(如果父節點也是 4-節點,則繼續分裂),將 4-節點分解為兩個 2-節點。
插入新鍵值
:
將新鍵值插入到合適的 2-節點或 3-節點中,保證節點內的鍵值順序正確。
刪除(Deletion)
找到要刪除的鍵值位置
:
若刪除的是葉節點的鍵值,直接刪除即可。
刪除內部節點的鍵值
:
用前驅或後繼鍵值替換要刪除的鍵值,然後在葉節點中刪除前驅或後繼鍵值。
處理 2-節點的鍵值不足
:
若刪除操作導致節點鍵值不足(2-節點變成 1-節點),則需要進行「鍵值借用」或「合併」操作。
鍵值借用
:從相鄰兄弟節點中借取一個鍵值,使當前節點成為 2-節點。
合併節點
:若兄弟節點是 2-節點,則將兄弟節點與父節點的鍵值合併,形成新的 3-節點或 4-節點。
節點分裂(Node Split)
當 4-節點插入新鍵值後無法容納更多的鍵值時,需要進行節點分裂:
將 4-節點中的中間鍵值提升到父節點。
4-節點分解為兩個 2-節點。
若父節點也是 4-節點,則繼續對父節點進行分裂,直到樹恢復平衡。
優缺點
優點
高度平衡
:所有葉節點都位於相同的深度,避免了退化成鏈表的情況。
操作簡單
:每個節點最多只有三個鍵值,可以有效地減少旋轉與調整次數。
穩定性高
:適合用於資料庫索引等需要大量查詢操作的場景。
缺點
節點需要儲存更多鍵值
:相較於二元搜尋樹,每個節點需要儲存更多鍵值與子節點指標,因此節點的記憶體消耗較大。
插入與刪除較為複雜
:當節點鍵值數過多時,可能需要進行多次分裂或合併操作。
使用場景
資料庫系統索引結構
:如 B 樹、B+ 樹等結構的基礎,用來提升資料庫查詢效能。
檔案系統管理
:用來建立檔案系統的層次結構,方便快速查找檔案或資料夾。
平衡樹管理
:適合用於鍵值數量較多且需要平衡操作的應用場景。
留言
追蹤
檢舉
上一篇
[Day25] 2-3樹 與 紅黑樹 筆記
下一篇
[Day27] 關於Heap的刷題筆記(1046)
系列文
[30天LeetCode挑戰] 每天一點演算法,讓技巧融會貫通
共
30
篇
目錄
RSS系列文
訂閱系列文
2
人訂閱
26
[Day26] 2-3-4樹 筆記
27
[Day27] 關於Heap的刷題筆記(1046)
28
[Day28] 2-3樹刷題筆記(701)
29
[Day29] LeetCode第938題 Range Sum of BST 刷題筆記
30
[Day30] LeetCode第1382題 Balance a Binary Search Tree 刷題筆記
完整目錄
直播研討會
{{ item.subject }}
{{ item.channelVendor }}
{{ item.webinarstarted }}
|
{{ formatDate(item.duration) }}
直播中
立即報名
尚未有邦友留言
立即登入留言
iThome鐵人賽
參賽組數
1064
組
團體組數
40
組
累計文章數
22207
篇
完賽人數
602
人
看影片追技術
看更多
{{ item.subject }}
{{ item.channelVendor }}
|
{{ formatDate(item.duration) }}
直播中
熱門tag
看更多
15th鐵人賽
16th鐵人賽
13th鐵人賽
14th鐵人賽
12th鐵人賽
11th鐵人賽
鐵人賽
2019鐵人賽
javascript
2018鐵人賽
python
2017鐵人賽
windows
php
c#
windows server
linux
css
react
vue.js
熱門問題
要怎知道LINE使用者的使用地址
防火牆互通問題
outlook無法收發信
Cisco 防火牆密碼確認正確,可是無法登入
小公司 兩台Win Server執行 AD Server ,更新電腦後,需要再多加一組Linux 作業系統來運行資料庫採集
開啟Microsoft Edge 瀏覽器無法開啟網頁,出現錯誤訊息
伺服器維護廠商
bat檔截斷問題
一開機就自動鎖定帳戶
Palo alto防火牆網頁解密問題?
熱門回答
防火牆互通問題
outlook無法收發信
Palo alto防火牆網頁解密問題?
開啟Microsoft Edge 瀏覽器無法開啟網頁,出現錯誤訊息
if函數中的>&<&=是否可以使用儲存格代替
熱門文章
每日一篇學習筆記 直到我做完專題 :( [Day6]
每日一篇學習筆記 直到我做完專題 :( [Day7]
每日一篇學習筆記 直到我做完專題 :( [Day8]
每日一篇學習筆記 直到我做完專題 :( [Day9]
每日一篇學習筆記 直到我做完專題 :( [Day10]
IT邦幫忙
×
標記使用者
輸入對方的帳號或暱稱
Loading
找不到結果。
標記
{{ result.label }}
{{ result.account }}