广泛应用

引言中提到Splay的应用十分广泛,实际也如此。这里介绍它的一个十分特别的应用:在某些情况下替代块状链表。

替代块状链表对于什么是块状链表,本文不做介绍,有兴趣的读者可以去阅读相关论文(如苏煜的论文《对块状链表的一点研究》)。

块状链表的作用就是维护一个序列。而Splay作为一个树状结构,怎么做到这点呢?我们考虑给序列的每个元素加上一个权值,这个值就是元素在序列中的位置。我们可以发现,这时以这个值为关键字将这个序列插入一棵二叉查找树,树的中序遍历竟然就是这个序列!而无论树的形态如何变化,只要没有破坏二叉查找树的性质,我们可以很容易发现树的中序遍历也不会发生变化。所以,伸展操作不会破坏中序遍历,Splay也就可以用来存储这个序列。这样维护序列的时间复杂度为O(nlogn),在部分题目中完全可以替代块状链表(时间复杂度为O(n*sqrt(n)))。

实际上,我们没有必要加入权值,它除了能够帮助我们理解为什么树状结构可以存储一个序列以外没有任何其它的作用。实现的时候只需要根据序列递归建树即可(每次以序列最中间的元素为树根,左右两部分元素递归建树)。

实际应用来看一个Splay很经典的应用。

题目要求对于一个序列,维护三种操作:删除当前序列第x个元素到第y个元素(例如序列ADBCDCE删除第2~4个元素之后变为ADCE),在当前序列第x个元素后插入一段元素(例如ABCD在第2个元素后插入序列DEC变成ABDECCD),将当前序列的第x个元素到第y个元素逆序(如ACEDCBDF的第3~7个元素逆序后变成ACDBCDEF)。

第一个操作的实现很容易:只需要先把第x-1个元素伸展到根,再把第y+1个元素伸展到x的右子树的根。这样,第x个元素到第y个元素的序列就会作为第y+1个元素的左子树在平衡树里出现,如图4(和“删除大于l小于r的数”操作很像,自己用几个例子画画吧^_^),删除这棵子树即可。

图4伸展后树的形态

第二个操作更加简单:先把第x个元素伸展到根,再把第x+1个元素伸展到x的右子树的根。此时再把需要插入的序列建立一棵子树插入到第x+1个元素的左子树(原先为空)即可。这个操作和第一个操作很像。

那么,对于第三个操作,我们要怎么办呢?

这里,我们要借鉴线段树的一个经典操作——懒标记。

首先,把第x-1个元素伸展到根;然后,将第y+1个元素伸展到根的右孩子。此时,第x个元素到第y个元素组成的序列就出现在第y+1个元素的左子树的位置上。此时,对此子树的根打上一个懒标记(如果已经存在一个懒标记则撤消),说明子树表示的序列需要被翻转,而不必立即进行翻转。当之后访问到这个结点的时候,只需要将懒标记“下放”到两个孩子并交换两个孩子的位置即可。这样做的正确性毋庸置疑,而时间复杂度显然不会增加一个数量级——懒标记的下放只不过在旋转操作中顺便进行罢了。

参考文献及附件

  1. 《伸展树的基本操作与应用》,杨思雨,2006

  2. 《伸展树操作详解》,马朔,2006

  3. 《对块状链表的一点研究》,苏煜,2007

  4. superbt,作者未知,时间未知

  5. 《生日快乐》,NOI,2006

    摘自--《神奇的Splay-TheMagical Splay-product of sqybi》

[Splay的应用]相关推荐

  1. 二逼平衡树——树套树(线段树套Splay平衡树)

    题面 Bzoj3196 解析 线段树和Splay两棵树套在一起,常数直逼inf,但最终侥幸过了 思路还是比较简单, 在原数组维护一个下标线段树,再在每一个线段树节点,维护一个对应区间的权值Splay. ...

  2. 简析平衡树(三)——浅谈Splay

    前言 原本以为\(Treap\)已经很难了,学习了\(Splay\),我才知道,没有最难,只有更难.(强烈建议先去学一学\(Treap\)再来看这篇博客) 简介 \(Splay\)是平衡树中的一种,除 ...

  3. AVL树、splay树(伸展树)和红黑树比较

    AVL树.splay树(伸展树)和红黑树比较 一.AVL树: 优点:查找.插入和删除,最坏复杂度均为O(logN).实现操作简单 如过是随机插入或者删除,其理论上可以得到O(logN)的复杂度,但是实 ...

  4. bzoj1251: 序列终结者 (splay)

    splay可以用于维护序列,比如noi的维修序列,比如这道 发现当时splay没写总结,也没题解 然后重新写splay竟然耗了一个晚上 结果是因为max[0]没有附最小值!!血一样的教训 最后祭出in ...

  5. BZOJ 1503 郁闷的出纳员(splay)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 题意:给出一个数列(初始为空),给出一个最小值Min,当数列中的数字小于Min时自动 ...

  6. [BZOJ1503]郁闷的出纳员(Splay)

    Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...

  7. Splay ---- 2018牛客多校第三场 区间翻转搞区间位移 或者 rope可持久化块状链表

    题目链接 题目大意: 就是每次把牌堆中若干个连续的牌放到堆顶,问你最后牌的序列. 解题思路: Splay 区间翻转的模板题: 对于一个区间[1,2,3,4,5,6,7,8][1,2,3,4,5,6,7 ...

  8. splay + 线段树 ---- P3765总统选举 [带修改的动态区间众数 摩尔投票+n棵splay]

    题目链接 题目大意: 解题思路: 1.摩尔投票法: 题意是找n个数内出现次数大于n/2的数 保证存在这个数用的方法叫做摩尔投票法 首先我们注意到这样一个现象: 在任何数组中,出现次数大于该数组长度一半 ...

  9. Splay ---- 区间翻转 区间最大值 区间加 P4146 序列终结者

    题目链接 题目大意: 解题思路: 这是一道很入门的Splay的题目 但是第一次写有很多坑点 首先是maxmaxmax值的更新:就是因为这个点的最小值是会出现负数负数的,当你左右儿子有一个没有的话,那么 ...

  10. Splay ---- 文艺平衡树区间翻转的建树模式

    Splay 的区间操作 这个splay已经不是平常的权值splay了, 每个节点维护区间的位置取决于它在树里面的位置 首先这课splay中序遍历的结果就是你维护的整个区间的数值!!注意这个中序遍历很重 ...

最新文章

  1. php 反序列化工具 phpggc 简介
  2. 高考成绩等位分查询2021,等位分查询(等位分查询系统)
  3. mysql提示符prompt的用法
  4. 判断ShellExecute函数是否执行完一个程序的方法
  5. 程序员面试金典 - 面试题 04.01. 节点间通路(图的遍历)
  6. Springmvc接收json数据的4种方式
  7. 将深度缓冲z值变换到相机坐标系
  8. NetScaler通过DHCP服务器获取IP地址
  9. 设计一款知识性产品需要考虑十二个基本问题
  10. 车辆维修管理系统mysql_数据库课设计 汽车修理管理系统.doc
  11. Discuz门户模板乱码解决方案
  12. Adversarial Machine Learning 经典算法解读(FGSM, DeepFool)
  13. 计算BDP值和wnd值
  14. 轮循与连接-- 细雪之舞
  15. Python入门必学,用Python练习画个美队盾牌
  16. Android画扇形区域,Android百度地图画扇形
  17. vscode 扩展 本地_使用众包扩展产品本地化
  18. HyperLedger Fabric - 超级账本(2.2)启动网络 - 手动
  19. 浅谈学习Scratch的必要性
  20. HP EliteDesk 800 G4 DM 35W (Japan) Mini Tower黑苹果efi引导文件

热门文章

  1. 如何搭建Bugzilla
  2. STM32---设备电子签名
  3. android gridview 设置字体,我想为GridView设置字体
  4. 截图工具FastStone Capture 10.0官方简体中文版
  5. RC滤波器(高通/低通)
  6. 微信小程序开发(三)入门之创建打卡活动
  7. CentOS7.6安装教程
  8. JavaScript高级编程 III
  9. 在Ubuntu上安装VM WarePlayer 编译不过
  10. 寻找技术人丢失的三种气质