二叉樹總結(五)伸展樹、B-樹和B+樹

1、伸展樹html

伸展樹(Splay Tree)是一種二叉排序樹,它能在O(log n)內完成插入、查找和刪除操做。數據庫

由於,它是一顆二叉排序樹,因此,它擁有二叉查找樹的性質;除此以外,伸展樹還具備的一個特色是:當某個節點被訪問時,伸展樹會經過旋轉使該節點成爲樹根。這樣作的好處是,下次要訪問該節點時,可以迅速的訪問到該節點。可是,它並非單純的把訪問的節點放性能

到樹根就完了,它還能減小該節點的訪問路徑上的節點的深度。spa

假設想要對一個二叉查找樹執行一系列的查找操做。爲了使整個查找時間更小,被查頻率高的那些條目就應當常常處於靠近樹根的位置。因而想到設計一個簡單方法,在每次查找以後對樹進行重構,把被查找的條目搬移到離樹根近一些的地方。伸展樹應運而生,它是一種自設計

調整形式的二叉查找樹,它會沿着從某個節點到樹根之間的路徑,經過一系列的旋轉把這個節點搬移到樹根去。3d

伸展樹保證從空樹開始的任意連續的m次對樹的操做最多話費花費O(mlogn)時間(n是節點數);所以,它不存在壞的輸入序列。指針

自底向上伸展樹code

伸展樹包含之字形和一字型兩種情形。htm

之字形狀況blog

找到的節點是X時,相似平衡二叉樹中的LR旋轉的狀況,能夠將X變成樹根;

一字型狀況

找到的節點是X時,相似平衡二叉樹中的LL旋轉的狀況,使用兩次LL旋轉時就能夠將X變成樹根;

P(X) : 得到X的父節點,G(X) : 得到X的祖父節點(=P(P(X)))。
Function Buttom-up-splay:
    Do
        If X 是 P(X) 的左子結點 Then
            If P(X)是G(X)的左子結點
                P(X) 繞G(X)右旋
            Endif
            X 繞P(X)右旋
        Else If X 是 P(X) 的右子結點 Then
            If P(X)是G(X)的右子結點
                P(X) 繞G(X)左旋
            Endif 
            X 繞P(X)左旋
        Endif
    While (P(X) != NULL)
EndFunction

自頂向下伸展樹

在自底向上的伸展樹中,咱們須要求一個節點的父節點和祖父節點,所以這種伸展樹難以實現。所以,咱們能夠構建自頂向下的伸展樹。

當咱們沿着樹向下搜索某個節點X的時候,咱們將搜索路徑上的節點及其子樹移走。咱們構建兩棵臨時的樹──左樹和右樹。沒有被移走的節點構成的樹稱做中樹。在伸展操做的過程當中:

  1. 當前節點X是中樹的根。
  2. 左樹L保存小於X的節點。
  3. 右樹R保存大於X的節點。

基本的zig旋轉

相似LL旋轉,將X的子樹放到R樹上。

zig-zag旋轉

兩次LL旋轉,將Z變成樹根,注意,第二次旋轉B的位置是,變成X的右子樹;

以上是左旋轉的狀況,它會把路徑上的節點放到R樹上,若是是右旋轉,則它會把路徑上的節點相似的掛到L樹上。

合併

最後當找到目標節點時,合併L樹、中樹、R樹。

只須要將目標節點當作樹根,L樹當作目標節點的左子樹,目標節點的原左子樹放到L樹的右子樹;同理R樹做爲目標節點的右子樹,原目標節點的右子樹做爲R樹的左子樹。

2、B-樹

定義:

一棵m階B-樹是擁有如下性質的多路查找樹:

  1. 非葉子結點的根結點至少擁有兩棵子樹;
  2. 每個非根且非葉子的結點含有k-1個關鍵字以及k個子樹,其中⌈m/2⌉≤k≤m;
  3. 非葉子結點的關鍵字個數=指向兒子的指針個數-1;

  4. 非葉子結點的關鍵字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];

  5. 非葉子結點的指針:P[1], P[2], …, P[M];其中P[1]指向關鍵字小於K[1]的子樹,P[M]指向關鍵字大於K[M-1]的子樹,其它P[i]指向關鍵字屬於(K[i-1], K[i])的子樹;

  6. 全部的葉子結點都在同一層。

B-樹的特性:

  1. 關鍵字集合分佈在整顆樹中;
  2. 任何一個關鍵字出現且只出如今一個結點中;
  3. 搜索有可能在非葉子結點結束;
  4. 其搜索性能等價於在關鍵字全集內作一次二分查找;
  5. 自動層次控制;

下圖是一顆3階B-樹:

插入

刪除

應用

  • B-tree索引是數據庫中存取和查找文件(稱爲記錄或鍵值)的一種方法。
  • 硬盤中的結點是B-tree結構的

實現

參考:https://www.roading.org/algorithm/introductiontoalgorithm/b-%E6%A0%91%E7%9A%84c%E5%AE%9E%E7%8E%B0.html

3、B+樹

其定義基本與B-樹同,除了:

  1. 非葉子結點的子樹指針與關鍵字個數相同;
  2. 非葉子結點的子樹指針P[i],指向關鍵字值屬於[K[i], K[i+1])的子樹(B-樹是開區間);
  3. 爲全部葉子結點增長一個鏈指針;
  4. 全部關鍵字都在葉子結點出現;

B+的搜索與B-樹也基本相同,區別是B+樹只有達到葉子結點才命中(B-樹能夠在非葉子結點命中),其性能也等價於在關鍵字全集作一次二分查找;
B+的特性:

  • 全部關鍵字都出如今葉子結點的鏈表中(稠密索引),且鏈表中的關鍵字剛好是有序的;
  • 不可能在非葉子結點命中;
  • 非葉子結點至關因而葉子結點的索引(稀疏索引),葉子結點至關因而存儲(關鍵字)數據的數據層;
  • 更適合文件索引系統;

查找

應用

相關文章
相關標籤/搜索