首页 > 其他分享 >「FHQ-Treap —— 码量最小的平衡树」学习笔记

「FHQ-Treap —— 码量最小的平衡树」学习笔记

时间:2024-07-29 13:39:54浏览次数:15  
标签:val int 码量 Treap 分裂 Split FHQ

不同于普通 Treap,FHQ-Treap 不需要左旋和右旋操作来处理数据。因此 FHQ-Treap 也称作无旋 Treap。

FHQ-Treap 是基于 Split(分裂)和 Merge(合并)两种操作的平衡树。其与普通 Treap 的原理完全不同。

一些基础的操作:例如 Insert(插入元素)和 Delete(删除元素)。

对于 Insert(插入元素),新建一棵只有一个元素的 FHQ-Treap,再将这棵 Treap 与之前的 Treap 合并即可。

对于 Delete(删除元素),将这棵 Treap 中的某个元素从其中分裂出去,即可视作已经删除。

而其他一些普通 Treap 能够做到的操作它也能做到。一切都是因为最关键的 Split(分裂)和 Merge(合并)。

Split —— 分裂

Split(int p,int val,int &l,int &r)

一般每次 Split 操作会将当前的 Treap 分裂成一棵 \(\le\) 分裂标准的 Treap 和一棵 \(>\) 分裂标准的 Treap。

其包含四个参数,\(p\) 和 \(val\) 以及 \(l\) 和 \(r\)。

其中 \(p\) 表示当前枚举到的 Treap 的根,\(val\) 表示此次分裂操作的分裂标准。

其中带&的 \(l\) 和 \(r\) 则记录分裂后两颗 Treap 的根。

我们现在枚举到了一颗 Treap,于是有:

  • 若当前枚举到的 Treap 的根的权值 \(\le\) 分裂标准,因为左子树内的所有权值必定都 \(\le\) 分裂标准,则不需要继续考虑左子树,直接进入右子树。

  • 若当前枚举到的 Treap 的根的权值 \(>\) 分裂标准,因为右子树内的所有权值必定都 \(>\) 分裂标准,则不需要继续考虑右子树,直接进入左子树。

递归 Split 即可。

Code:

void Split(int p,int val,int &l,int &r){
	if(!p){
		l=r=0;
		return ;
	}
	if(Treap[p].val<=val) l=p,Split(Treap[p].r,val,Treap[p].r,r); 
	else r=p,Split(Treap[p].l,val,l,Treap[p].l); 
	pushup(p);
	return ;
}

标签:val,int,码量,Treap,分裂,Split,FHQ
From: https://www.cnblogs.com/HAM-qwq/p/18329888

相关文章

  • 怎么优雅的踩爆 Treap
    在发布了文章Treap学习笔记后我认为我的平衡树能力已经登峰造极了。但是Treap真tmd太难写了,所以我们的czy大佬开发除了一种可以优雅的踩爆Treap的绝佳方案。#include<bits/stdc++.h>usingnamespacestd;intn;structtree{ vector<int>v; voidadd(intx){v.in......
  • FHQ_Treap
    先记个板子#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+5;intn;intrt,son[N][2],sz[N],va[N],pri[N],tot;structFHQ{ voidpushup(intx){sz[x]=sz[son[x][0]]+sz[son[x][1]]+1;} intmerge(intx,inty) { if(!x||!y)returnx|y; if......
  • FHQ treap(再见splay------)
    但凡打过平衡树的应该都知道\(\huge{二逼平衡树}\)这道题,抄了两个小时的splay版题解,然后发现了\(\color{maroon}FHQtreap\):$\large\color{green}这是splay$structjjtree{ inlinevoidup(rintx){sz[x]=sz[son[x][0]]+sz[son[x][1]]+cnt[x];} inlineboolso(rintx){retu......
  • 平衡樹專題Treap
    前言:题单在此:HL平衡树0701-题单-洛谷|计算机科学教育新生态(luogu.com.cn)平衡树什么是平衡树?首先我们需要知道二叉查找树的内容。二叉查找树(BST:BinarySearchTree)首先,他是一棵二叉树其次,他的左子树的权值<根节点的权值<右子树的权值最后,也是最重要的,他的中序遍历......
  • 算法课程笔记——FHQ-Treap(无旋)
    算法课程笔记——FHQ-Treap(无旋)......
  • 平衡树 Treap & Splay [学习笔记]
    平衡树\(\tt{Treap}\)&\(\tt{Splay}\)壹.单旋\(\tt{Treap}\)首先了解\(\tt{BST}\)非常好用的东西,但是数据可以把它卡成一条链\(\dots\)于是,我们将\(\tt{Tree}\)与\(\tt{heap}\)(堆)合并,以保证平衡树\(\log\)的深度。具体地,我们可以使用旋转操作实现K8He的图......
  • 平衡树 Treap & Splay [学习笔记]
    平衡树\(\tt{Treap}\)&\(\tt{Splay}\)壹.单旋\(\tt{Treap}\)首先了解\(\tt{BST}\)非常好用的东西,但是数据可以把它卡成一条链\(\dots\)于是,我们将\(\tt{Tree}\)与\(\tt{heap}\)(堆)合并,以保证平衡树\(\log\)的深度。具体地,我们可以使用旋转操作实现K8He的图......
  • 【老鼠看不懂的数据结构】FHQTreap 初识
    Treap弱平衡的随机性很强的老鼠看不懂的平衡树Q:为什么叫Treap?A:看看二叉搜索树(BST)和堆(Heap),组合起来就是Treap其中,二叉搜索树的性质是:左子节点的值(val)比父节点小右子节点的值(val)比父节点大如果这些节点的值都一样,这棵树就会退化成一颗(?)链。对,我知道你在想......
  • 浅谈 FHQ Treap
    浅谈FHQTreap目录浅谈FHQTreap简单介绍前置操作结构分裂split合并merge一般操作Insertdelete查询排名为\(x\)的数查询\(v\)的排名rank查询\(x\)的前驱precursor查询\(x\)的后继successor版题简单介绍FHQTreap,以下简写为\(fhq\),是一种treap(树堆)的变体,功能......
  • fhq-treap
    一些细节本质是利用合并、分裂实现增、删、查。根据用途分为两类分裂:第一类:当作set一样使用,就是中序遍历就把数字排序了。分裂操作按照权值分裂。如果根\(\lek\),那么左边都要归入\(x\),递归右边,\(x\)换成右边(看还能接上去多少)\(>k\)同理,最后pushup一下。第二......