昨晚终于明白了splay双旋中的一些细节,今日整理如下

注:题目用的2002HNOI营业额统计,测试结果均来及codevs 网站的评测结果 http://codevs.cn/problem/1296/

本题完整代码请见http://www.cnblogs.com/TheRoadToTheGold/p/6372009.html

1、这是旋转部分的代码

inline void splay(int x,int goal)
{
while(pre[x]!=goal)
{
int y=pre[x];
int kind=ch[y][]==x;
if(pre[y]==goal) rot(x,kind);//父节点是目标节点,单旋
else
{
kind=ch[pre[y]][]==y;
if(ch[y][!kind]==x)//一字型
{
rot(y,kind);
rot(x,kind);
}
else//之字型
{
rot(x,!kind);
rot(x,kind);
}
}
}
root=x;
}

理解较浅,目前认为之字形旋转的本质就是单旋,一字型才算双旋

2、双旋与单旋的区别

先看看运行结果

左边是单旋,右边是双旋,空间几乎一样,时间差距很大

why?

图1:

图2的单旋结果

图2:

双旋结果

可以发现,双旋之后的层数要比单旋之后的层数少1

这只是5层(本图中第6层对5不干扰),如果层数更多呢

所以,双旋层数比单旋要更少

手推一下,上图中第1次旋转结果的树的形态与单旋结果的树的形态是一样的,只是4和3换了个位

所以双旋的优越性在一字型层数>4时才会体现

为什么双旋层数要少?

继续观察图2的第2个和第3个,发现少的那一层是因为4和1处在了同一层

即双旋 使 待旋转点的旋转方向的孩子 与待旋转点的爷爷节点  处在同一层

换用字母表示:

设a的旋转方向的孩子是b,a的父节点是c,c的父节点是d

那么双旋使b、d处在同一层,因为b、d都成为了c的孩子

为什么?分析双旋的两次旋转

先旋转父节点,使爷爷节点和自己都成为父节点的孩子,此时父节点和自己处在同一层,原来的爷爷节点成为自己的父节点

然后旋转自己,自己旋转方向的孩子节点成为自己现在父节点(原先爷爷节点)的孩子,也就是和自己原先父节点处在了同一层

这也是我认为之字型旋转也是单旋的原因,因为之字型旋转是让自己旋转2次,与单旋并无不同

3、旋转顺序

A、代码中一字型旋转顺序是先转父节点,再转自己

①不能改成先转自己,再转父节点

先转自己让自己到父节点的位置,父节点到自己的孩子位置,再转父节点,又转回去了,跟没转一个样

②可以改成旋转自己两次,但那样就相当于单旋

B、之字型旋转的旋转顺序是连续转自己2次

看图,

可以发现连续转自己两次,每次使自己上移一层

而如果先转父节点,可以发现自己原来在哪儿还在那儿,只是父节点和爷爷节点换了而已,相当于这一次白转了

当然你也可以先转父节点,再转自己(两次旋转方向相同),因为的正确性是有保证的

对比一下,上边是先转父节点,再转自己,下边是连续转自己两次(一字型旋转均是先转父节点,再转自己)

上边空间明显大,时间也多点儿

         

浅谈splay的双旋的更多相关文章

  1. 浅谈splay(点的操作)

    浅谈splay(点的操作) 一.基本概念 splay本质:二叉查找树 特点:结点x的左子树权值都小于x的权值,右子树权值都大于x的权值 维护信息: 整棵树:root 当前根节点  sz书上所有结点编号 ...

  2. 浅谈splay

    \(BST\) 二叉查找树,首先它是一颗二叉树,其次它里面每个点都满足以该点左儿子为根的子树里结点的值都小于自己的值,以该点右儿子为根的子树里结点的值都大于自己的值.如果不进行修改,每次查询都是\(O ...

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

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

  4. Lct浅谈

    Lct浅谈 1.对lct的认识 ​ 首先要知道$lct$是什么.$lct$的全称为$link-cut-tree$.通过全称可以看出,这个数据结构是维护树上的问题,并且是可以支持连边断边操作.$lct$ ...

  5. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  6. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

  7. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

  8. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  9. 浅谈WebService的版本兼容性设计

    在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...

随机推荐

  1. HDU 1565 方格取数(1) 轮廓线dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others) ...

  2. Git初用心得

    第一次使用git,因为之前操作系统的实验需要,在虚拟机中使用过lniux系统,所以对这种用指令输入而不是图形化的程序感觉不是很陌生.感觉git还是很人性化的,git gui就是图形界面,操作起来也不复 ...

  3. golang数据类型转换

    int--string //string到int value_int,err:=strconv.Atoi(string) //int到string str:=strconv.Itoa(value_in ...

  4. Good Time 冲刺 一

    2018/6/14 我们组之前没有开发小程序的经验,所以在尝试中不断探索与学习.在完成小程序的初步注册和界面完善后,我们组开始进行开发任务. 1.1成员简述: 王怡镔:“今天主要学习小程序开发知识及相 ...

  5. 结对项目:四则运算web

    1)Coding.Net项目地址 https://git.coding.net/DandelionClaw/WEB_Calculator.git 注:本项目为web端,并且需要连接SQL Server ...

  6. 团队作业4--第一次项目冲刺2(Alpha版本)

    1.会议 第二次会议: ①:总结第一天任务出现的问题 ②:安排下面两天的任务 2任务安排 3.任务分解图 4.燃尽图 5.适当的项目程序/模块的最新(运行)截图 6.心得 因为做前端的同学并不擅长这方 ...

  7. Robot Framework 教程 (4) - 自定义Library

    RobotFrame Work为我们提供了包括OS.Android.XML.FTP.HTTP.DataBase.Appium.AutoIt.Selenium.Watir等大量的库.在使用过程中,除这些 ...

  8. [转帖]什么是TRIM与GC?他们是怎样让SSD保持高速的

    什么是TRIM与GC?他们是怎样让SSD保持高速的 2017-7-6 15:43  |  作者:Strike   |  关键字:SSD,TRIM,GC,超能课堂 分享到       SSD的写入方式决 ...

  9. java 基础 --概念--005

    1,面向对象特征 封装(encapsulation):隐藏对象的属相和访问细节,仅提供对外公共访问方式.继承(inheritance).多态(polymorphism) 2,类:一组相关的属性和行为的 ...

  10. iOS 数据库sqlite完整增删改查操作

    1: 创建数据库表格 1.1 — 表格创建使用一个数据库软件快速创建:软件大小14.3M; 下载地址:http://pan.baidu.com/s/1qWOgGoc; 表格创建-> 打开软件,点 ...