码迷,mamicode.com
首页 > 其他好文 > 详细

splay

时间:2021-04-07 10:41:01      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:查询   treap   code   区间   flag   复杂   标记   splay   style   

splay、treap、set、红黑树、avl、B树

splay: 平衡二叉树,经过左旋和右旋操作,不会改变中序遍历的顺序。维护的是二叉树的一个中序序列,同时调整树的高度。

技术图片

右旋要变的信息:

技术图片

 

 

 

在插入和查询操作x的时候,都会把x变到树根的位置。 

技术图片

 

核心:每操作一个节点,均将该节点旋转到树根。一个点用到的话,之后的话很可能会再次用到。平均意义上,每次操作的时间复杂度是log(n)

怎样每次把某个点旋转到树根:

splay(x, k):将点x旋转到点k下面,如果k = 0,那么将x旋转到根;k为根节点,把x转到根节点的下面。

技术图片

 

技术图片

 

技术图片

 

 

将一个序列插到y的后面。找到y的后继z。

1)将y转到根,splay(y, 0)

2)将z转到y的下面,splay(z, y)

技术图片

 技术图片

 

 技术图片

 

 技术图片

 

 splay如何去维护信息:

 2437. splay

1)找第k个数,size。递归

2)懒标记,flag(整个区间要不要翻转)

pushup:维护信息,放在旋转最后,利用两儿子的信息算出根节点的信息,root->size = root->left->size + root->right->size + 1;

pushdown() :递归之前。下传懒标记,然后递归翻转左右儿子。swap(root->left, root->right),将标记下传到左右儿子,将当前结点标记清空。

splay时时刻刻保证中序遍历是我们当前序列的顺序。

 技术图片

 

splay

标签:查询   treap   code   区间   flag   复杂   标记   splay   style   

原文地址:https://www.cnblogs.com/longxue1991/p/14618629.html

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