BST(二叉搜尋樹)、AVL樹、紅黑樹、2-3樹、B樹、B+樹、LSM樹、Radix樹比較
二叉搜尋樹
二叉搜尋樹(Binary Search Tree,簡寫BST),又稱為二叉排序樹,屬於樹的一種,通過二叉樹將資料組織起來,樹的每個節點都包含了健值 key、資料值 data、左子節點指標、右子節點指標。其中健值 key 是最核心的部分,它的值決定了樹的組織形狀;資料值 data 是該節點對應的資料,有些場景可以忽略,舉個例子,key 為身份證號而 data 為人名,通過身份證號找人名;左子節點指標指向左子節點;右子節點指標指向右子節點。
二叉搜尋樹特點
- 左右子樹也分別是二叉搜尋樹。
- 左子樹的所有節點 key 值都小於它的根節點的 key 值。
- 右子樹的所有節點 key 值都大於他的根節點的 key 值。
- 二叉搜尋樹可以為一棵空樹。
- 一般來說,樹中的每個節點的 key 值都不相等,但根據需要也可以將相同的 key 值插入樹中。
AVL樹
AVL樹,也稱平衡二叉搜尋樹,AVL是其發明者姓名簡寫。AVL樹屬於樹的一種,而且它也是一棵二叉搜尋樹,不同的是他通過一定機制能保證二叉搜尋樹的平衡,平衡的二叉搜尋樹的查詢效率更高。
AVL樹特點
- AVL樹是一棵二叉搜尋樹。
- AVL樹的左右子節點也是AVL樹。
- AVL樹擁有二叉搜尋樹的所有基本特點。
- 每個節點的左右子節點的高度之差的絕對值最多為1,即平衡因子為範圍為[-1,1]。
紅黑樹
紅黑(Red-black)樹是一種自平衡二叉查詢樹,1972年由Rudolf Bayer發明,它與AVL樹類似,都在插入和刪除操作時能通過旋轉操作保持二叉查詢樹的平衡,以便能獲得高效的查詢效能。
它可以在 O(logn) 時間內做查詢,插入和刪除等操作。紅黑樹是2-3-4樹的一種等同,但有些紅黑樹設定只能左邊是紅樹,這種情況就是2-3樹的一種等同了。
對於AVL樹來說,紅黑樹犧牲了部分平衡性以換取插入/刪除操作時少量的旋轉操作,整體來說效能要優於AVL樹。
紅黑樹性質
- 節點是紅色或黑色。
- 根節點是黑色。
- 每個葉節點(NIL節點)是黑色的。
- 每個紅色節點的兩個子節點都為黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)
- 從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。
2-3樹
2-3樹,是最簡單的B-樹,其中2、3主要體現在每個非葉子節點都有2個或3個子節點,B-樹即是平衡樹,平衡樹是為了解決不平衡樹查詢效率問題,常見的二叉平衡書有AVL樹,它雖然提高了查詢效率,但是插入操作效率不高,因為它需要再每次插入節點後維護樹的平衡,而為了解決查詢效率同時有兼顧插入效率,於是提出了2-3樹。
2-3樹特點
- 2-3樹是一棵平衡樹,但不是二叉平衡樹。
- 對於高度相同的2-3樹和二叉樹,2-3樹的節點數要大於滿二叉樹,因為有些節點可能有三個子節點。
- 2-3樹可以是一棵空樹。
- 對於2節點來說,該節點儲存了一個key及對應的value,除此之外還儲存了指向左右兩邊的子節點,子節點也是一個2-3節點,左子節點所有值小於key,右子節點所有值大於key。
- 對於3節點來說,該節點儲存了兩個key及對應的value,除此之外還儲存了指向左中右三個方向的子節點,子節點也是一個2-3節點,左子節點的所有值小於兩個key中較小的那個,中節點的所有值在兩個key值之間,右子節點大於兩個key中較大的那個。
- 對2-3樹進行中序遍歷能得到一個排好序的序列。
B樹
B樹即平衡查詢樹,一般理解為平衡多路查詢樹,也稱為B-樹、B_樹。是一種自平衡樹狀資料結構,能對儲存的資料進行O(log n)的時間複雜度進行查詢、插入和刪除。B樹一般較多用在儲存系統上,比如資料庫或檔案系統。
B樹特點
- B樹可以定義一個m值作為預定範圍,即m路(階)B樹。
- 每個節點最多有m個孩子。
- 每個節點至少有ceil(m/2)個孩子,除了根節點和葉子節點外。
- 對於根節點,子樹個數範圍為[2,m],節點內值的個數範圍為[1,m-1]。
- 對於非根節點,節點內的值個數範圍為[ceil(m/2)-1,m-1]。
- 根節點(非葉子節點)至少有兩個孩子。
- 一個有k個孩子的非葉子節點包含k-1個值。
- 所有葉子節點在同一層。
- 節點內的值按照從小到大排列。
- 父節點的若干值作為分離值分成多個子樹,左子樹小於對應分離值,對應分離值小於右子樹。
B+樹
B+樹是B樹的一種變體,也屬於平衡多路查詢樹,大體結構與B樹相同,包含根節點、內部節點和葉子節點。多用於資料庫和作業系統的檔案系統中,由於B+樹內部節點不儲存資料,所以能在記憶體中存放更多索引,增加快取命中率。另外因為葉子節點相連遍歷操作很方便,而且資料也具有順序性,便於區間查詢。
B+樹特點
- B+樹可以定義一個m值作為預定範圍,即m路(階)B+樹。
- 根節點可能是葉子節點,也可能是包含兩個或兩個以上子節點的節點。
- 內部節點如果擁有k個關鍵字則有k+1個子節點。
- 非葉子節點不儲存資料,只儲存關鍵字用作索引,所有資料都儲存在葉子節點中。
- 非葉子節點有若干子樹指標,如果非葉子節點關鍵字為k1,k2,...kn,其中n=m-1,那麼第一個子樹關鍵字判斷條件為小於k1,第二個為大於等於k1而小於k2,以此類推,最後一個為大於等於kn,總共可以劃分出m個區間,即可以有m個分支。(判斷條件其實沒有嚴格的要求,只要能實現對B+樹的資料進行定位劃分即可,有些實現使用了m個關鍵字來劃分割槽間,也是可以的)
- 所有葉子節點通過指標鏈相連,且葉子節點本身按關鍵字的大小從小到大順序排列。
- 自然插入而不進行刪除操作時,葉子節點項的個數範圍為[floor(m/2),m-1],內部節點項的個數範圍為[ceil(m/2)-1,m-1]。
- 另外通常B+樹有兩個頭指標,一個指向根節點一個指向關鍵字最小的葉子節點。
- 在進行刪除操作時,涉及到索引節點填充因子和葉子節點填充因子,一般可設葉子節點和索引節點的填充因子都不少於50%。
關於LSM樹
LSM樹,即日誌結構合併樹(Log-Structured Merge-Tree)。其實它並不屬於一個具體的資料結構,它更多是一種資料結構的設計思想。大多NoSQL資料庫核心思想都是基於LSM來做的,只是具體的實現不同。
LSM樹誕生背景
傳統關係型資料庫使用btree或一些變體作為儲存結構,能高效進行查詢。但儲存在磁碟中時它也有一個明顯的缺陷,那就是邏輯上相離很近但物理卻可能相隔很遠,這就可能造成大量的磁碟隨機讀寫。隨機讀寫比順序讀寫慢很多,為了提升IO效能,我們需要一種能將隨機操作變為順序操作的機制,於是便有了LSM樹。LSM樹能讓我們進行順序寫磁碟,從而大幅提升寫操作,作為代價的是犧牲了一些讀效能。
關於磁碟IO
磁碟讀寫時涉及到磁碟上資料查詢,地址一般由柱面號、盤面號和塊號三者構成。也就是說移動臂先根據柱面號移動到指定柱面,然後根據盤面號確定盤面的磁軌,最後根據塊號將指定的磁軌段移動到磁頭下,便可開始讀寫。
整個過程主要有三部分時間消耗,查詢時間(seek time) +等待時間(latency time)+傳輸時間(transmission time) 。分別表示定位柱面的耗時、將塊號指定磁軌段移到磁頭的耗時、將資料傳到記憶體的耗時。整個磁碟IO最耗時的地方在查詢時間,所以減少查詢時間能大幅提升效能。
Radix樹
Radix樹,即基數樹,也稱壓縮字首樹,是一種提供key-value儲存查詢的資料結構。與Trie不同的是,它對Trie樹進行了空間優化,只有一個子節點的中間節點將被壓縮。同樣的,Radix樹的插入、查詢、刪除操作的時間複雜度都為O(k)。
Radix樹特點
一般由根節點、中間節點和葉子節點組成。
每個節點可以包含一個或多個字元。
樹的葉子結點數即是資料條目數。
從根節點到某一節點經過路徑的字元連起來即為該節點對應的字串。
每個節點的所有子節點字串都不相同
相關文章
- 雜湊,二叉樹,紅黑樹,B樹,B+樹,LSM樹等資料結構做索引比較二叉樹資料結構索引
- 資料結構之MySQL獨愛B+樹(二叉樹、AVL樹、紅黑樹、B樹對比)資料結構MySql二叉樹
- 資料結構之樹結構概述(含滿二叉樹、完全二叉樹、平衡二叉樹、二叉搜尋樹、紅黑樹、B-樹、B+樹、B*樹)資料結構二叉樹
- 平衡二叉樹,B樹,B+樹二叉樹
- 二叉樹、B樹以及B+樹二叉樹
- 多路查詢樹(2-3 樹、2-3-4 樹、B 樹、B+ 樹)
- 資料結構中的樹(二叉樹、二叉搜尋樹、AVL樹)資料結構二叉樹
- 淺談樹形結構的特性和應用(上):多叉樹,紅黑樹,堆,Trie樹,B樹,B+樹...
- 平衡二叉查詢樹:紅黑樹
- B樹與B+樹區別辨析
- 滿二叉樹、完全二叉樹、平衡二叉樹、二叉搜尋樹(二叉查詢樹)和最優二叉樹二叉樹
- 資料結構和演算法-二叉樹,AVL,紅黑樹資料結構演算法二叉樹
- B 樹和 B+樹的區別, 為什麼 MySQL 要使用 B+樹MySql
- Java實現紅黑樹(平衡二叉樹)Java二叉樹
- 平衡二叉樹(AVL樹),原來如此!!!二叉樹
- 十三、Mysql之平衡二叉樹(AVL樹)MySql二叉樹
- 紅黑樹
- 手擼二叉樹——AVL平衡二叉樹二叉樹
- 【資料結構】B樹、B+樹詳解資料結構
- 演算法與資料結構——AVL樹(平衡二叉搜尋樹)演算法資料結構
- Java 樹結構實際應用 四(平衡二叉樹/AVL樹)Java二叉樹
- 手寫AVL平衡二叉搜尋樹
- 二叉搜尋樹
- 『分享』兩篇講 B-樹 B+ 樹的文章
- 5分鐘瞭解二叉樹之AVL樹二叉樹
- 自動平衡二叉樹的構建-AVL樹二叉樹
- 平衡二叉樹(AVL樹)和 二叉排序樹轉化為平衡二叉樹 及C語言實現二叉樹排序C語言
- 咬文嚼圖式的介紹二叉樹、B樹/B-樹二叉樹
- 資料結構☞二叉搜尋樹BST資料結構
- 二叉搜尋樹和二叉樹的最近公共祖先二叉樹
- js實現完全排序二叉樹、二叉搜尋樹JS排序二叉樹
- 平衡二叉樹(AVL)二叉樹
- 樹套樹
- JavaScript 二叉搜尋樹以及實現翻轉二叉樹JavaScript二叉樹
- Day20 | 654.最大二叉樹 、 617.合併二叉樹 、 700.二叉搜尋樹中的搜尋 98.驗證二叉搜尋樹二叉樹
- 瞭解紅黑樹的起源,理解紅黑樹的本質
- 2-3-4樹對應紅黑樹的實現,紅黑樹的融會貫通!!!
- MySQL之B+樹分析MySql