伸展树基础(2)-12.1

在X插入时,展开使得X成为新的根。

查找X时,也要对X或者是因为没找到而路径上最后一个节点进行展开。

初步想法是沿着根往下进行一次遍历,以及而后从底向上的一次遍历。这样太麻烦了啊。

所以本文介绍自顶向下的伸展树:在初始访问路径上就进行一次次的旋转。

我们设X为中间树的根,L存放树T中小于X中的节点,但不存放X的子树的节点,R同理。初始化时X为T的根,L和R为空树

我们设展开函数为Splay(int Item,Position X),也就是说如果Item在X中,那么Item要变成新的根;不在的话,路径上最后一个点要变成新的根。

分为以下三种情况进行旋转(其实一共六种,其余三种对称即可)

①: 单旋转->

zig-zig:先对x-y进行AVL里的单旋转,再对y-z进行一次①:

所以就是说进行一次单旋转,就能和①结合了

③:zig-zag:

这里我们用简易版zig-zag,这样就能和①相结合了

然后看如何恢复为一棵树

----》》》

根据这个函数,我总结了一下应该是这么个思路:

首先创建一个NullNode,它的值为item;具体为什么下面再解释

①如果Item<X:

①如果Item比X的左节点小,那就执行一次单旋转,X=X->left(解释:如果X左节点不存在,那么Item就和X左节点一样大了)

②之后如果X的左节点不存在,那么就结束了。

③存在的话,就可以执行三种旋转中的第一种了。

②如果Item>X:

对称一下

③如果Item==X;

就把左中右三个树合并起来

插入:进行一次Splay(Item,X),在根据Item<>=X,进行插入更改即可。

 

疑问:只用到O(1)空间,摊还时间为O(logN)

时间: 2024-12-25 14:27:54

伸展树基础(2)-12.1的相关文章

伸展树基础(1)

伸展树是:任意M次对树的操作最多花费O(MlogN)的时间. 摊还时间: 如果M次操作运行O(MF),那么摊还时间就是O(F) 展开: 分为三种情况: ①X节点的爸爸就是根节点那么旋转一次即可咯 ②X有爷爷,且为左左左或右右右所谓的zig-zig一字型,那么先对k1-k2转,再对k2-k3转, ③X有爷爷,且为之字型(zig-zag),执行双旋转即可. 展开操作不仅使X变为根节点,其他大部分节点深度也减少了一半.  

伸展树基础(Splay)

3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3948  Solved: 1627 [Submit][Status][Discuss] Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数,因输出最小的排名)4. 查询排名为x的数5. 求x的前驱(前驱定义为

高级数据结构实现——自顶向下伸展树

[0]README 1) 本文部分内容转自 数据结构与算法分析,旨在理解 高级数据结构实现——自顶向下伸展树 的基础知识: 2) 源代码部分思想借鉴了数据结构与算法分析,有一点干货原创代码,for original source code, please visithttps://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter12/p345_topdown_splay_tree 3) you c

poj_3468 伸展树

题目大意 一个数列,每次操作可以是将某区间数字都加上一个相同的整数,也可以是询问一个区间中所有数字的和.(这里区间指的是数列中连续的若干个数)对每次询问给出结果. 思路 1. 伸展树的一般规律 对于区间的查找更新操作,可以考虑使用伸展树.线段树等数据结构.这里使用伸展树来解决.     伸展树对数组进行维护的核心思想是,将需要维护的一组数单独提取出来,形成一棵子树(一般为整棵树的根节点的右子节点的左孩子节点 为根),然后再这个子树上进行操作.此时进行某些操作(如 ADD, SUM 等),只需要在

Splay伸展树

伸展树,感觉对我这种菜鸟还是有些吃力,主要也是旋转的时候吧,把要查询的节点旋转到根节点,看网上是有两种方法,一是从上到下,一是从下到上.从上到下,是把树拆分成中树,左树和右树,始终保证目标节点在中树,不断向下把中树的节点添到右树或者左树,直到目标节点为中树的根,再将三树合并起来.另外一种从下到上,旋转操作类似AVL树中的旋转,但是判断好像不是很好写,我写的是从上到下的,另外删除也很巧妙,先把目标节点旋转到根,若此时左子树为空直接删除,否则找到左子树最右的节点当头,利用伸展树的特殊旋转就可以一步删

HNOI2002(伸展树)

营业额统计 Time Limit:5000MS     Memory Limit:165888KB     64bit IO Format:%lld & %llu Submit Status Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动

[转载]伸展树(一)之 图文解析 和 C语言的实现

概要 本章介绍伸展树.它和"二叉查找树"和"AVL树"一样,都是特殊的二叉树.在了解了"二叉查找树"和"AVL树"之后,学习伸展树是一件相当容易的事情.和以往一样,本文会先对伸展树的理论知识进行简单介绍,然后给出C语言的实现.后序再分别给出C++和Java版本的实现:这3种实现方式的原理都一样,选择其中之一进行了解即可.若文章有错误或不足的地方,希望您能不吝指出! 目录 1. 伸展树的介绍 2. 伸展树的C实现 3. 伸展树的

数据结构-伸展树

声明:本文是对某高中生的竞赛论文学习的文章 介绍: 二叉查找树能够支持多种动态集合操作.对于一个含有n个结点的完全二叉树,这些操作的最还情况运行时间是O(lgn),但如果树是含有n个结点的线性链,则这些操作的最坏情况运行时间为O(n).而像红黑树.AVL树这种二叉查找树的变形在最坏情况下,仍能保持较好性能. 本文将要介绍的伸展树也是二叉查找树的变形,它对空间要求及编程难度的要求相对不高. 伸展树: 伸展树与二叉查找树一样,具有有序性.即伸展树的每一个结点x满足:该结点的左子树中的每个元素都小于x

UVA 11922 Permutation Transformer —— splay伸展树

题意:根据m条指令改变排列1 2 3 4 - n ,每条指令(a, b)表示取出第a~b个元素,反转后添加到排列尾部 分析:用一个可分裂合并的序列来表示整个序列,截取一段可以用两次分裂一次合并实现,粘贴到末尾可以用一次合并实现. 翻转可以采用在每个结点上做标记的方法,flip = 1意味着将这棵子树翻转,可以类似线段树用一个pushdown()实现标记向下传递. 可以发现当前排列就是伸展树的中序遍历序列.中序遍历打印结果即可. 注意代码中设置了虚拟首结点0的技巧. 代码如下: 1 #includ