Splay

【笔记】Splay 详细解读 Splay 是一种平衡树,并且是一棵二叉搜索树(BST)。它满足对于任意节点,都有左子树上任意点的值 < 当前节点的值 < 右子树上任意点的值。优点:支持多种操作。缺点:常数较大。单次操作均摊复杂度Olog⁡nO(\log n)Ologn。(注:关于 Splay 单次操作均摊复杂度的证明见OI-WikiSplay 基于旋转操作维护树的平衡。旋转分为左旋 (zag) 和右旋 (zig)。旋转,即在保证平衡树中序遍历不变的前提下,改变整个树的深度。 阅读详情

                                                      Splay

     写这玩意好累~~~~

     这里贴一份用指针写的(为什么周围的神犇不喜欢用指针呢??)

   

#include<cstdio>
#include<iostream>
#include<cstring>
#define MAXN  100000


using namespace std;


class SplayTree{
private:
  struct node
      {
         int key;
         node *lc,*rc,*fa;
      };
      node *root,*tail;
      node pool[MAXN];
  inline void rotate(node *x)
  {
      node *y=x->fa;
      node *z=y->fa;
      node *b=x==y->lc ? x->rc : x->lc;
      x->fa=z,y->fa=x;
      if(b)
        b->fa=y;
      if(z)
        ( z->lc==y ? z->lc : z->rc )=x;
      if(x==y->lc)
        x->rc=y,y->lc=b;
      else
        x->lc=y,y->rc=b;
  }
  inline void Splay(node *x,node *target=NULL)
  {
     while(x->fa!=target)
     {
          if(x->fa->fa!=target)
          {
                  if((x->fa->fa->lc==x->fa)==(x->fa->lc==x))
                    rotate(x->fa);
                  else
                    rotate(x);
          }
          rotate(x);
     }
     if(target==NULL)
        root=x;
  }
  inline node *find(int key)
  {
      node *p=root;
      while(p)
      {
         if(key>p->key)
            p=p->rc;
         else
            if(key<p->key)
            p=p->lc;
         else
            return p;
      }
      return NULL;
  }
public:
    SplayTree()
    {
               root=NULL;
               tail=pool;
    }
    inline bool  Find(const int &key)
    {
        node *p=find(key);
        if(!p)
            return false;
        Splay(p);
        return  true;
    }
    inline void Insert(const int key)
    {
        node **q=&root;
        node *p=root;
        node *fp=NULL;
        while(p)
        {
             fp=p;
             if(key>p->key)
                q=&p->rc,p=p->rc;
             else
             if(key<p->key)
               q=&p->lc,p=p->lc;
             else
             {
                 Splay(p);
                 return ;
             }
        }
        p = tail++;
        p->key = key;
        p->fa = fp, p->lc = p->rc = NULL;
        *q = p;
        Splay(p);
    }
    inline void Delete(const int key)
    {
         node *p=find(key);
         Splay(p);
         if(!p->lc&&!p->rc)
         root=NULL;
         else
            if(!p->lc)
            root->fa=NULL,root=p->rc;
            else
                if(!p->rc)
                root->fa=NULL,root=p->lc;
            else
            {
                node *pre=p->lc,*next=p->rc;
                while(pre->rc)
                    pre=pre->rc;
                while(next->lc)
                    next=next->lc;
                Splay(pre);
                Splay(next,pre);
                next->lc=NULL;
            }
    }
};

         这也有个Splay专辑~~~~~很有用呢(用数组写的)

http://www.cnblogs.com/proverbs/archive/2013/01/15/2860717.html

平衡树·splay 文章目录1.About splay2.基本操作2.1 数组是干啥的?2.2 基本操作 1.About splay splaysplaysplay是实现平衡树的一种方法 他需要满足一个条件,就是对于一个点为根节点的子树,他的左子树全部小于根节点,右子树全部大于根节点 那他为什么叫这个名字呢? 我们查询一下百度翻译 但是事实上,感觉splaysplaysplay跟张开没什么关系… splayspla... 阅读详情

相关推荐

BZOJ 3223 浅谈SPLAY伸展树算法区间翻转

世界真的很大 SPLAY是个很厉害的数据结构,相对于其他平衡树,比如treap,对于每一次查询虽然常数偏大,但是却能力保总复杂度趋近于nlogn,而且除了treap能支持的操作以外,还支持如区间翻转一类的特殊操作 其关键在于其独属的SPLAY操作 所以这次更多的是对SPLAY的一个详细总结 好像也是tarjan发明的,orz 看题先: description:您需要写一种数据结构(可参考

BerryKanry的博客 1683

SPLAY树

前言 根据研究表明,90%的访问都是针对10%的元素。提高这90%的访问的效率,就明显改善了对整个访问的效率。 核心思想:把最近访问过的结点提升到根,后续访问的深度将减小。把这种提升结点的操作称为“伸展Splay”。以伸展操作为基础的二叉排序树也就相应称为伸展树(Splay Tree)。 开始 基于前言中十分有用(坑爹 )的话,于是我们需要用SPLAY树来优化时间,即把刚操作的点引到根下,即S...

TL的博客 1007

平衡树SPLAY

平衡树SPLAY 平衡树这个东西一点用没有,非常有用,而且锻炼码力,是个非常好的模板题! 那么SPLAY这个东西 十分的毒瘤 我只调了一上午就调出来了!(我真棒) 首先 我们要知道平衡树是一棵二叉查找树 他可以处理:加点,删点,前驱,后继,num的排名,某排名的num,合并两棵平衡树,分离两棵平衡树 关于其原理 网上有很多 而且比较简单 对于splay来说 原理并不是最难的 码代码才是最难的! ...

qq_45342177的博客 324

splay教程集合

前言 splay是一个维护序列(一堆数)比较好的数据结构,他通过双旋可以有效的避免二叉排序树退化成一条链的情况(证明可以看论文),让平均复杂度在logn,他可以维护一个序列即:有n个数字,每个数字的位置跟值都告诉你了,有许多在某个区间(位置)上的操作。还可以维护一堆数字即:没有位置的概念,就是给你一堆数字,没有在区间上的操作,通常存在序列区间上反转,交换,插入删除新的数字,求第k个位置的数字的时候...

急流勇进 738

Splay入门详解

Splay入门详解 写在前面 听说平衡树是一种强大的数据结构,听同年级或高年级大佬们讲起来也感觉很牛笔的亚子,而最近XC又叫我们去学习一下LCT!? 又因为Splay是学习LCT的基础,而且又比较脍炙人口,于是我便学了一下,经过一个白天的努力,也终于是学会了一点皮毛。 为了加深我对Splay的理解,把网上一些讲得有点模糊的知识点给没看懂的同学讲解清楚,于是我就写了这篇博客,保证大家都可以入门 (不行也别怪我哦) Splay是神马东东? 下面给出百度的解释:Splay 下面我用简单易懂的语言来简单介绍一下:

CMC_YXY的博客 1089

Splay学习笔记,每个操作都会执行splay。

文章目录前言平衡树Zig和Zag引入splay操作 前言 之前学了fhq—Treap,一种靠分裂与合并维护平衡的一种树,期望复杂度是logn,常数也较大。Treap也有带旋转版本的,但是为了早日学会LCT还是先学Splay。也建议初学者先学不带旋转的平衡树,当然还有更简单的替罪羊树也可以先学。先借简单的来了解为什么要这样做。然后学更难的就跟好理解了。 平衡树 BST(二叉搜索树)的缺点是容易被卡成链,所以我们想要通过某种方法来使它的树高不那么任意被卡。我理解的平衡树就是为了使BST保持平衡,即树的高度期望是

xuxiaobo1234的博客 565

[Splay伸展树]splay树入门级教程

本弱鸟对于SPLAY树的一些理解。。。

SKY的C 1万+

Windows 2000系统下载与全套镜像安装:从镜像校验到驱动兼容性实战指南

操作系统镜像文件是安装系统的核心载体,其完整性直接影响部署成败。哈希校验作为验证文件一致性的基础手段,能有效避免因镜像损坏导致的安装中断。对于已停止支持的操作系统,如Windows 2000,其镜像获取与安装更具挑战性,但它在工业控制、专用终端及怀旧技术研究中仍有不可替代的价值。通过理解镜像命名规则、服务包等级(如SP4)及引导方式,结合虚拟机或老硬件平台,可以顺利完成部署。同时,驱动兼容性是老系统运行的关键瓶颈,需针对性解决网卡、显卡等外设驱动问题。本文从镜像下载、校验到安装配置,系统梳理了Windows

weixin_32050773的博客 341

浅谈Splay

由于插入初始是单调的,所以直接用二叉搜索树的性质找到插入位置,然后把新节点旋转到根节点。删除操作需要先将要删除的节点旋转到根节点,然后删除根节点,并将剩余的树重新连接起来。在操作2后,根据二叉搜索树的性质,l的右子树只有下标>l的节点,所以r在l的右子树里。在操作3后,r是l的右节点,根据二叉搜索树的性质,r的左子树里只有下标<r的节点。所以此时r的左子树里的节点就是区间l,r里的数,再清空r的左子树就可以了。设当前点为A,父节点为B,父节点的父节点为C。用来根据子节点的信息更新父节点的信息。

2301_79450649的博客 775

用Blender给ArduPilot无人船编队设计灯光秀:从建模到飞行的保姆级教程

本文详细介绍了如何利用Blender和ArduPilot为无人船编队设计灯光秀的全流程技术方案。从3D动画设计、坐标转换、数据导出到ArduPilot飞控配置和灯光控制,提供了一套完整的保姆级教程,帮助开发者实现水面灯光编队表演。

weixin_29213525的博客 384

中文实体关系抽取数据集大盘点:从百度Duie2.0到医疗CBLUE,哪个更适合你的NLP项目?

本文全面分析了中文实体关系抽取领域的主流数据集,包括百度DuIE 2.0、医疗CBLUE等,帮助开发者根据项目需求选择最适合的数据集。文章详细对比了各数据集的特点、适用场景及优化策略,为自然语言处理项目提供实用指南。

weixin_29284657的博客 121

Splay笔记

DS都快忘了。不会再写,只会再写别的。

2301_77504182的博客 1388

数字摄影与摄像中的图像信号处理器(ISP):流程与经典算法详解

图像信号处理器(Image Signal Processor, ISP)是现代数字成像系统(如智能手机、数码相机、网络摄像头等)中的核心组件,扮演着将图像传感器(如CMOS或CCD)捕获的原始光电信号转换为高质量、可供观看或进一步处理的数字图像的关键角色。在数字摄影和摄像的整个链路中,光线首先通过镜头(Lens)聚焦到图像传感器上,传感器将光信号转换为模拟电信号,随后经过模数转换(A/D转换)变为原始的数字图像信号。

qq_44682523的博客 3720

单旋SPLAY的优化

单旋splay的优点是好写,缺点就是太慢了。经过以前大量的正版splay和单旋splay之间的对比发现单旋splay大概要慢50%。。。加上如下几个优化后单旋SPLAY绝对可以媲美正版SPLAY,是PNOI,NOI,居家旅行,哔~~~~~~,必备良数据结构关于单旋splay有如下几个优化(不会加大代码量,要不然还要单旋splay干嘛):1.对于大量插入操作,写一个过程:buildtree,建议一颗完全二叉树插入树中,很多题目一开始就需要buildtree,所以不会增加代码,在NOI05 sequence中加

Evil.livE 3925

[华中科技计组实验]logisim完成单周期5级流水MIPS CPU

[华中科技计组实验]logisim完成单周期5级流水MIPS32 CPU hu~,终于完成了,真是费劲呐 支持24条指令,5级流水线,可以对分支指令处理,寄存器冲突处理,指令ROM为1K,数据RAM为1M,32位MIPS指令集CPU 但是… 大量使用比较器造成硬件开销巨大,测试一下发现这尼玛真是个老爷车还没单周期跑的快,自己电脑cpu占百分之八九十只能跑到20多赫兹,一个走马灯跑了半天,可优化空间太大了,写了那么多天造成这个破样,有点悲剧。。。 先放个图大伙参考就行了,要是有人想听思路的话接下来再更 .

zrc的博客 1万+

海康读码器上位机开发避坑指南:IDMVS客户端之外,如何用C# SDK搞定扫码、数据比对与实时控制?

本文详细介绍了如何利用海康读码器的C# SDK进行二次开发,实现从基础扫码到复杂工业控制的全流程解决方案。内容涵盖SDK架构解析、多设备管理系统构建、业务逻辑与设备控制实现,以及系统集成与性能优化等关键环节,为工业自动化领域的开发者提供实用指南。

weixin_30642561的博客 550

splay

前言 ZJOI倒计时,开始复习一些没写过博客也好久没码的算法啦 介绍 splay是一个平衡树,他满足二叉搜索树的性质:左子树的值都小于等于自己,右子树的值都大于等于自己 splay的思想是通过rotate的方式把要操作的点转到根节点 空间复杂度\mathcal O(n)O(n),时间复杂度单次均摊\mathcal O(nlogn)O(nlogn)

zhouyuheng2003的博客 1308

国产数据库安装部署说明

国产数据库安装部署说明

weixin_38203586的博客 907

Splay模板 Splay题型大荟萃

以HDU4453为例,整理了一些Splay的题型 /* 【算法介绍】 Splay叫做伸展树,是一种二叉搜索树,也可以说是一种平衡树结构。 其可以维护节点的左右次序值,也就是说,我们在Splay上做中序遍历的次序输出节点,得到的便是所有节点的左右次序。 【数据结构】 int ch[N][2], fa[N]; //节点的链接关系 int num[N], sz[N]; //节点个数与子树大小 1

snowy_smile的博客 966

基于 YOLOv8 的自动驾驶车辆障碍物检测与避障路径规划

本文探讨基于YOLOv8的自动驾驶车辆障碍物检测与避障路径规划系统。在感知层面,采用YOLOv8模型实现多类别障碍物识别,结合单目视觉距离估计和ByteTrack多目标跟踪算法,完成障碍物的稳定检测与运动状态估计。在路径规划层面,设计分层规划架构,融合全局路径规划与局部避障算法,重点实现Frenet坐标系下的采样优化算法和基于模型预测控制的实时避障轨迹生成。通过完整的代码实现与仿真实验,验证系统在复杂交通场景下的有效性与实时性,为自动驾驶开发者提供从理论到实践的完整技术参考。 关键词:YOLOv8;自动驾驶

huanghm88的专栏 248

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Splay学习笔记

昨天这个时候到现在终于把Splay给搞明白了,还A了一道郁闷的出纳员;刚学完的感受:我再也不碰这东西了;做完郁闷的出纳员的感受:我发誓这辈子不当出纳员(虽然这确实只是个入门题……) 于是来讲一讲这个恶心的东西吧……(全程不用指针,请做好心理准备……) 学习前请先学习下二叉搜索树,里面可能直接用到这个东西 首先,Splay是一个数据结构,为了突出它是一个数据结构,所以给他开个结构体……struc

FAreStorm的博客 3079

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: 矩阵乘法
下一篇: 网络流
DJS_K_D
博客等级 码龄12年 2粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值