码迷,mamicode.com
首页 > 编程语言 > 详细

【算法详解】splay的初步了解

时间:2018-02-15 14:33:30      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:bsp   splay   合成   代码   ash   查询   图片   详解   特性   

qwq表示最近感受到了不停课的鸭梨啊,好难搞啊……算法太难学了……我好菜啊qwq

其实半个多月前就可以写这篇文章,不过由于时间紧张没写emmmmmm,不扯闲言乱语了,如果有什么写的不好的地方凑活一下吧2333333333

splay是一种可以使树的最大深度尽可能的维持在logn级别的一种数据结构,当然splay的平衡确实不是非常好,但是它胜在代码量和思维难度小(像我这种菜鸡学个splay就快gg了),适合于算法竞赛,它中文名又叫伸展树,这也体现了它除平衡外的另一种特性——便于分裂和合并,这也可以利用splay方便的在序列上搞事情。

介绍完splay的特性,再来说它是如何维护平衡的。splay通过左旋和右旋这两种最基本的操作组合成共6种旋转模式,当然我们可以通过一些判断来简化旋转模式,接下来先讲一下基本操作技术分享图片

 

通过这张图我们可以看出,一个节点旋转的方向是由自己对于父亲的位置决定的,左蛾子向右转,右蛾子向左转,因此我们不需要刻意判断单次旋转方向

接下来说最重要的操作:splay

splay是这个数据结构最为重要的操作,是这棵树保持平衡的前提(虽然splay平衡效率不高),它是由多次旋转组合而来,每次我们考虑一个点和它的父亲、祖父,对着三个点进行操作,直至这个点到达根部,因为我们刚才把单次旋转简化,不用判断左旋还是右旋,所以splay的操作也简化成了两种:三个点同方向或者不同方向

技术分享图片

第一种

技术分享图片

第二种

splay本身作为一种二叉搜索树,可以满足logN查询前驱后继、第k名和k数字的排名,而且代码复杂度小,还支持快速分裂合并序列(待补),缺点是常数贼大,容易被卡

所以考虑学一个奇奇怪怪的平衡树……

至于代码

 

【算法详解】splay的初步了解

标签:bsp   splay   合成   代码   ash   查询   图片   详解   特性   

原文地址:https://www.cnblogs.com/Loi-dfkdsmbd/p/8214944.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!