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的時候,咱們將搜索路徑上的節點及其子樹移走。咱們構建兩棵臨時的樹──左樹和右樹。沒有被移走的節點構成的樹稱做中樹。在伸展操做的過程當中:
基本的zig旋轉
相似LL旋轉,將X的子樹放到R樹上。
zig-zag旋轉
兩次LL旋轉,將Z變成樹根,注意,第二次旋轉B的位置是,變成X的右子樹;
以上是左旋轉的狀況,它會把路徑上的節點放到R樹上,若是是右旋轉,則它會把路徑上的節點相似的掛到L樹上。
合併
最後當找到目標節點時,合併L樹、中樹、R樹。
只須要將目標節點當作樹根,L樹當作目標節點的左子樹,目標節點的原左子樹放到L樹的右子樹;同理R樹做爲目標節點的右子樹,原目標節點的右子樹做爲R樹的左子樹。
2、B-樹
定義:
一棵m階B-樹是擁有如下性質的多路查找樹:
非葉子結點的關鍵字個數=指向兒子的指針個數-1;
非葉子結點的關鍵字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];
非葉子結點的指針:P[1], P[2], …, P[M];其中P[1]指向關鍵字小於K[1]的子樹,P[M]指向關鍵字大於K[M-1]的子樹,其它P[i]指向關鍵字屬於(K[i-1], K[i])的子樹;
B-樹的特性:
下圖是一顆3階B-樹:
插入
刪除
應用
實現
參考:https://www.roading.org/algorithm/introductiontoalgorithm/b-%E6%A0%91%E7%9A%84c%E5%AE%9E%E7%8E%B0.html
3、B+樹
其定義基本與B-樹同,除了:
B+的搜索與B-樹也基本相同,區別是B+樹只有達到葉子結點才命中(B-樹能夠在非葉子結點命中),其性能也等價於在關鍵字全集作一次二分查找;
B+的特性:
查找
應用