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万+

银河麒麟高级服务器操作系统V10SP2(X86)PXE无人值守批量部署实战指南

本文详细介绍了银河麒麟高级服务器操作系统V10SP2(X86)PXE无人值守批量部署的实战指南。通过PXE网络引导技术,实现全自动化、高效率的系统部署,特别适用于企业级数据中心和国产化替代项目。文章涵盖基础环境准备、关键服务配置、Kickstart高级定制及部署测试等核心内容,帮助用户快速掌握批量部署技巧。

weixin_42525637的博客 382

浅谈Splay

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

2301_79450649的博客 775

Windows系统下Mamba环境配置实战:从零到编译成功

本文详细记录了在Windows系统下从零开始配置Mamba深度学习环境的完整实战过程。针对官方不直接支持Windows的难点,文章提供了关键解决方案,包括安装特定版本的Python、PyTorch与第三方Triton,以及修改源码以解决Windows编译器的兼容性问题,最终成功编译并运行Mamba-SSM。

weixin_28842269的博客 499

【AI+教育】别再让 Cursor 只当编辑器了!4 步解锁 Claude 官方技能!

本文介绍了在Windows环境下通过OpenSkills工具在Cursor中调用Claude AI技能的方法。主要内容包括:1)安装Node.js环境;2)全局安装OpenSkills工具;3)安装Claude官方技能库;4)通过AGENTS.md文件同步技能;5)在Cursor中直接调用技能完成Excel、PPT等任务。文章提供了详细的操作步骤和示例,帮助用户快速上手使用AI技能提升工作效率。

奶爸的编程之路,也就一周冷个三天 751

Splay笔记

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

2301_77504182的博客 1388

单旋SPLAY的优化

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

Evil.livE 3925

.NET MAUI 第13讲 深入探索 .NET MAUI Essentials:让应用感知设备与环境,打造智能体验

摘要:本文介绍了.NET MAUI Essentials库如何赋能移动应用感知设备环境的能力。文章详细讲解了设备信息获取(DeviceInfo)、网络状态监测(Connectivity)、地理位置服务(Geolocation)、地图集成(Map)以及传感器(Accelerometer等)等核心功能的使用方法,并提供了完整的代码示例。通过一个综合练习,展示了如何构建设备信息仪表板,实时显示设备参数和网络状态,并实现位置获取与地图导航功能。这些跨平台API能显著提升应用智能化和用户体验,同时保持代码简洁高效。

AlphaNil的博客 1086

DIC新手避坑指南:压缩实验中的应变测量常见错误与数据校验技巧

本文为DIC技术新手提供了压缩实验中应变测量的全面避坑指南。文章系统梳理了从试样尺寸录入、散斑质量到数据后处理中应变方向与符号混淆、数据插值对齐等常见错误,并分享了基于MATLAB的自动化数据校验与可视化对比技巧,帮助建立可靠的实验数据分析SOP,确保DIC测量结果的准确性。

weixin_29313423的博客 112

splay

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

zhouyuheng2003的博客 1308

三维重建(十八)——colmap的使用(粗浅)

三维重建(十八)——colmap的使用(粗浅)

河海大学研究生在读的学习笔记 1373

Splay模板 Splay题型大荟萃

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

snowy_smile的博客 966

【图像增强(Image Enhancement )】专栏的相关说明,包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、关于答疑、文章目录、与我联系等(持续更新中...)

专栏内涉及的算法都是基于深度学习的图像增强算法;收录的文章基本上是基于Pytorch框架实现的,部分基于Tensorflow;预计完成100篇论文,并持续更新;专栏内文章主要为两部分:【论文精读】与【论文复现】论文精读:读懂论文,总结提炼,聚焦核心内容,不只是全文翻译论文复现:跑通流程,源码解析,提升代码能力,得到去噪结果以及指标计算综合而言,从大到小拆解模型结构,从小到大实现模型搭建。实现论文与源码的统一,深入理解论文行文逻辑与代码实现逻辑,融汇贯通二者思想,并学以致用。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 4050

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Splay学习笔记

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

FAreStorm的博客 3079

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值