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+的特性:
查找
应用