Splay 树

来源:互联网 发布:如何编写python程序 编辑:程序博客网 时间:2024/05/01 06:55

http://blog.csdn.net/niuox/article/details/8018280

结一下最近学习的Splay tree。万事开头难啊,像这种神一样的数据结构,刚学是很痛苦的,建议之前要把平衡树,SBT之类的数据结构先学学。
资料都是网上乱翻的,前一两道题,代码主要追随别人,后面慢慢的调整,成为自己的东西。
Splay tree意为伸展树,和别的不同的正是在于它的伸展操作。
在这里,我也证明,解释不了伸展树在时间复杂度,操作上的优势之类的。网上很正规的资料里都会有介绍
伸展树并不是严格意义上的平衡树,也还是极有可能退化成线性结构,但他的伸展操作能使它的每一次操作近似(logn),而且独特的伸展操作能解决一些其它数据结构实现不了的(如线段树,SBT等)。
先说伸展操作,在我的理解中,伸展操作和平衡树的保持平衡是类似的,只不过他不要求保持平衡,只是相应的旋转。
如果旋转的节点的父节点便是目标结点,那么一次旋转即可。但是在平衡树中这一步还要拆开。
举例:现在要将根结点的左孩子右旋操作,而此时如果根的左孩子存在右孩子的话,那么直接旋转过去,新的根便有两个左孩子,显然不可以,所以将左子树先执行左旋,再右旋即可。
如果在伸展树中,父节点并不是目标结点,那就存在爷爷结点,如果爷爷结点和父节点方向一样,那么连续两次上面的右旋或者左旋即可。如果方向不一样,便是一左一右两次旋转。画图比较好理解,大家可以从别的资料中找到图,在伸展树中称为一字型和之字型。虽然说的很复杂,但是在Splay中,代码已经被前辈们优化到很短,很精练。

感觉无论做什么就往头上转就对了

splay 一般用于一些序列的维护,对单个点的插入更新和删除。线段树比较多用于区间。主席树是离线的(还没学)

0 0