BST(二叉搜尋樹)、AVL樹、紅黑樹、2-3樹、B樹、B+樹、LSM樹、Radix樹比較

weixin_33806914發表於2018-12-25

二叉搜尋樹

二叉搜尋樹(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樹特點

一般由根節點、中間節點和葉子節點組成。
每個節點可以包含一個或多個字元。
樹的葉子結點數即是資料條目數。
從根節點到某一節點經過路徑的字元連起來即為該節點對應的字串。
每個節點的所有子節點字串都不相同

相關文章