首页 > 其他分享 >普通平衡树splay

普通平衡树splay

时间:2023-02-03 08:55:19浏览次数:35  
标签:左子 右子 旋转 splay 普通 平衡 树中 节点

和大多数的平衡树一样,splay 本质上也是二叉查找树,只是增加了翻转(rotate)操作来保证复杂度。

借用 OI Wiki 的图片,左旋和右旋的目的是为了尽可能降低平衡树的深度。

图中进行的就是 splay 操作的右旋,可以发现不论怎么旋转,保证整棵树的中序遍历顺序不变是最重要的前提条件,观察图中节点,圈号表示平衡树中的节点,方框框中的表示一颗子树,观察不能发现图中变化的主要有 x,p 和 x 的右子树 B。

所以左旋进行的操作如下:

  • 将 \(p\) 的左子树改为 \(x\) 的右子树,同时将 \(x\) 的右子树改为 \(p\)
  • 将 \(p\) 原来父亲的左子树改为 \(x\)
  • 将 \(x\) 的父亲改为 \(p\) 原来的父亲,\(p\) 的父亲改为 \(x\)

右旋的操作与左旋对称,所以可以将两个操作写成一个函数。

旋转操作在平衡树中并不少见,但是 splay 依靠的是一种特殊的旋转——“双旋”

双旋的方式主要有两种

  • zig-zig

如果 \(x,p,g\) 三点共线,那么先旋转 \(p,g\) 之间的边再旋转 \(x,p\) 之间的边。

  • zig-zag

如果 \(x,p,g\) 不共线,那么两次旋转都只转 \(x,p\) 之间的边

其余的 splay 操作大多基于二叉查找树本身的性质:

  • 一个点的左子树中的值都比这个点的值小
  • 一个点的右子树中的值都比这个点的值大

只需在一般的二叉查找树操作的最后加上将操作过的节点转到根上即可,因为先前经过的点后面经过的概率大于先前没经过的点,这也是 splay 看上去每次都要旋转复杂度很高但是均摊复杂度仍然优秀的原因。

几个区别如下:

  • 合并操作一般情况下直接将左子树最右边的节点定为根,根据二叉查找树的性质,这个节点一定大于所有的左子树节点并且小于所有的右子树节点,满足根的性质。如果左子树右子树中有一棵是空树直接返回不空的那棵树的根节点,如果左右字数都是空树则返回空树。
  • 在删除节点时,splay 先将要删除的节点找出来旋转到根上然后合并两棵子树
  • 在查询 \(x\) 的前驱和后继时,splay 先在树中插入 \(x\),然后将 \(x\) 转到根上,这时候左子树最右边的就是 \(x\) 的前驱,而右子树最左边的就是 \(x\) 的后继。

标签:左子,右子,旋转,splay,普通,平衡,树中,节点
From: https://www.cnblogs.com/0x3F/p/17087958.html

相关文章

  • 一名老了的普通程序员的未来在哪里
    6年程序员光景一撮而过,本命年来了,跨过35真的太不容易了。最近比较感兴趣K8S、K3S的的倒腾,虚拟机上部署单机K3S和K8S集群,再加上habor、jenkins一套下来也没什么特别的。当......
  • display block是什么意思?怎么用?
    https://www.php.cn/css-tutorial-412196.html设置display:block就是将元素显示为块级元素。对于所有的块级元素来说都是不需要用display:block来定义的,因为块级元素的默......
  • Java基础-普通类、抽象类、接口类
    普通类和抽象类的区别普通类可以有普通方法,不能有抽象方法;抽象类可以有普通方法和抽象方法普通类可以实例化,抽象类不能实例化普通类必须实现抽象类的抽象方法抽象类......
  • 不平衡数据集的建模的技巧和策略
    前言 本文讨论了处理不平衡数据集和提高机器学习模型性能的各种技巧和策略,涵盖的一些技术包括重采样技术、代价敏感学习、使用适当的性能指标、集成方法和其他策略。作者:E......
  • 可空类型转换为普通的类型
    在日常开发中,我们经常遇到可空类型赋值给另一个变量,会提示我们无法将Int?隐式转换为int,如图所示图1解决方案:通过Value属性可以把可空类型转换为普通的类型,如下图所示......
  • CSS布局display值inline、block、inline-block区别
    inline前后不会有换行,block前后会有换行,inline-block前后不会有换行,但内部会换行且可以设置高宽。,如下图所示: ......
  • 不平衡数据集的建模的技巧和策略
    不平衡数据集是指一个类中的示例数量与另一类中的示例数量显著不同的情况。例如在一个二元分类问题中,一个类只占总样本的一小部分,这被称为不平衡数据集。类不平衡会在构建......
  • linux普通用户上传文件失败
    解决方法: 给需要上传文件的目录授权,例如,你需要将本地文件上传到/opt/projects/目录下,你的普通户用户账号是opssudochown-Rops:ops/opt/projects/......
  • 力扣110 平衡二叉树
    题目:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。示例:输入:root......
  • xhost: unable to open display ""问题解决
    一、需求xhost可是增强vnc的图形界面显示二、问题解决设置一下dispaly  通过执行exportDISPLAY=x.x.x.x:1,x.x.x.x指的是虚拟机ip地址,DISPLAY用来设置将图形显示......