首页 > 其他分享 >【数据结构】Splay 树

【数据结构】Splay 树

时间:2023-10-23 19:45:44浏览次数:48  
标签:sz ch val int Splay 数据结构 节点

Splay

Splay 树(伸展树),是平衡树的一种,而且可以维护序列,进行一些序列操作。有些序列操作功能甚至是线段树实现不了的(经典的区间翻转)。
维护集合时,Splay 的中序遍历单调递增,而维护序列时,Splay 的中序遍历是维护的序列。
Splay 通过均摊(势能分析)来保证复杂度正确,单次插入,删除,查找操作复杂度为 \(O(\log n)\)

基本思想

Splay 均摊复杂度的基本思想是:每次操作一个节点,都把这个节点通过 Splay 操作伸展到根节点。

写在前面

Splay 代码实现上的一些技巧。

const int N = 1e5 + 5;

struct node
{
    int ch[2], fa;    // 左右孩子节点,父亲节点的编号
    int val, cnt, sz; // 当前节点的值,当前节点有多少个,当前子树的大小
#define lc (t[p].ch[0])
#define rc (t[p].ch[1])
} t[N];
int tot, root;
int new_node(int val) // 新建节点
{
    int x = ++tot;
    t[x].val = val, t[x].cnt = t[x].sz = 1;
    return x;
}
int get(int p) // 判断节点 p 是其父亲的左子节点或右子节点
{
    return p == t[t[p].fa].ch[1];
}
void push_up(int p) // 向上传递信息
{
    t[p].sz = t[lc].sz + t[rc].sz + t[p].cnt;
}
void clear(int p) // 清空一个节点
{
    t[p].ch[0] = t[p].ch[1] = t[p].fa = t[p].val = t[p].cnt = t[p].sz = 0;
}

旋转

Splay 和 Treap 的旋转操作类似但更丰富。可以分为单旋和双旋,双旋又可分为同构调整和异构调整。

单旋

分为左旋与右旋,

标签:sz,ch,val,int,Splay,数据结构,节点
From: https://www.cnblogs.com/JXOIer-zaochen/p/17783289.html

相关文章

  • Set 和 Map 数据结构
    Set基本用法ES6提供了新的数据结构Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。Set本身是一个构造函数,用来生成Set数据结构。consts=newSet();[2,3,5,4,5,2,2].forEach(x=>s.add(x));for(letiofs){console.log(i);}//2354上面代码通......
  • 飞码LowCode前端技术系列(一):数据结构设计
    简介飞码是京东科技研发的低代码产品,可使营销运营域下web页面快速搭建。飞码是单web页面搭建工具,从创建页面到监测再到投产的一站式解决方案。会通过七篇文章介绍飞码,分别是:(1)背景与数据结构设计,(2)如何便捷配置出页面-1,(3)如何便捷配置出页面-2,(4)如何便捷配置出页面-3,(5)如何便捷配置出......
  • 数据结构面试常问问题--保研及考研复试
    前言:Hello大家好,我是Dream。今年保研上岸山东大学人工智能专业(经验贴),现在将我自己的专业课备考知识点整理出来,分享给大家,希望可以帮助到大家!这是重点知识总结,如果你想看全部的内容的话,这里我给大家都已经打包好了,需要自取:保研复试全套材料+408专业课知识总结及思维导图(点击即可......
  • 14_数据结构与集合源码
    ......
  • 数据结构:二分查找法
    #include<iostream>#include<string>#include<ctime>#include<cstdlib>#include<algorithm>usingnamespacestd;//非递归版本的二分查找法intBinarySearch1(inta[],intn,intkey){intlow=0;inthigh=n-1;intmid;if(key......
  • Java List数据结构底层实现与常用实现类解析
    一、JavaList数据结构的底层实现原理List是Java中最常用的数据结构之一,它可以按照元素的插入顺序有序存储一组对象。在Java中,List接口有多种不同的实现方式,每种方式都有自己的底层实现机制。1.1数组实现ArrayList是List接口最常用的实现类之一,它使用数组作为底层数据结构。ArrayL......
  • 8皇后问题用基本数据结构实现(不用stl)
    1#include<iostream>2usingnamespacestd;34#defineSTACKSIZE25656intResult;//记录结果78typedefstruct9{10introw;11intcol;12}QueenPlace;1314typedefstruct15{16QueenPlace*pBase;17......
  • 数据结构-链表
    //节点classNode{constructor(element){this.element=elementthis.next=null}}//链表classLinkList{constructor(){this.size=0this.head=null}//根据index获取节点getNode(index){if(index<0||index>......
  • 数据结构之美:如何优化搜索和排序算法
    文章目录搜索算法的优化1.二分搜索2.哈希表排序算法的优化1.快速排序2.归并排序总结......
  • 数据结构:实验一+实验二
    数据结构:实验一数据结构:实验二......