首页 > 其他分享 >【学习笔记】fhq_treap 无旋平衡树

【学习笔记】fhq_treap 无旋平衡树

时间:2022-10-02 16:25:50浏览次数:90  
标签:cnt val int 无旋 treap now fhq 节点

推一个视频

引入

Treap平衡树原型:基于旋转实现的BST+Heap,通过随机索引和堆使得BST的单次复杂度稳定在 \(O(\log n)\)。

fhq treap则是将treap改造了一下,变成了基于分裂与合并实现的码量小但常数稍大的平衡树。

根据按值分裂与按大小分裂可以实现普通平衡树与文艺平衡树的功能(以及可持久化)。

详解

在fhq_treap中我们用一棵树的根来代表这棵树,一会你就能理解了。

前置代码:

struct node{
	int lc,rc,siz,pri,val;
}t[N+5];
int cnt,root;
mt19937 rnd(233);
inline int newcode(int val){
	t[++cnt].val=val;
	t[cnt].lc=t[cnt].rc=0;
	t[cnt].siz=1;
	t[cnt].pri=rnd();
	return cnt;
}
inline void upt(int now){t[now].siz=1+t[t[now].lc].siz+t[t[now].rc].siz;}

先来解决两个fhq_treap的基本操作:

1.Split(分裂)

按key这个值分裂的步骤即是,将小于等于key的数作为一棵新树X树,大于的则作为新树Y树。下图为一个样例:

由于BST的性质,当前节点的val小于等于key时可以直接把该节点加入X树,且无需再考虑该节点的左子树(因为左子树上的值都将小于等于当前节点的值),val大于key时同理。但另一个子树上就有可能出现大于key的或小于等于的,因此我们需要递归考虑左/右子树,并将当前节点的左/右儿子作为指针,匹配新的X/Y树成员(如样例中40的左儿子更新为30)

void split(int now,int val,int &x,int &y){
	if(!now){                  //空节点
		x=y=0;
		return;
	} 
	if(t[now].val<=val){
		x=now;             //加入x树
		split(t[now].rc,val,t[now].rc,y);   //递归考虑右子树
	}else{
		y=now;
		split(t[now].lc,val,x,t[now].lc);   //同理
	}
	upt(now);                  //更新siz
}

这里的 x 与 y 可以这么理解:
当我们还未在X树中加入任何数时,x引用的是X树的根节点编号,y同理;
当树中已存在数后,这里引用的便是已加入节点的左儿子/右儿子,用于匹配下一个将加入的节点

2.Merge(合并)

标签:cnt,val,int,无旋,treap,now,fhq,节点
From: https://www.cnblogs.com/chroneZ/p/16748940.html

相关文章

  • Fhq_Treap 和 Splay:谁才是序列之王?
    平衡树很久以前,我立志要学习所有的平衡树,然后把每个树的学习笔记都整理到相关博客中。而如今……今年欢笑复明年,不知退役在眼前。在阅读本文之前建议先学习二叉搜索树......
  • AcWing 算法提高课 treap平衡树
    1、基本性质tree+heap=treap平衡树包含treap红黑树splaysbtAVL等等splay比较常用treap=①BST二叉搜索树+②heap2、set不能做的操作  ⑤和⑥这种与排名相......
  • FHQ-treap 学习笔记
    介绍平衡树平衡树,又称treap,是树(tree)以及堆(heap)的合称,具体表现为形式上它是一棵二叉树,而性质上它又满足堆的性质。与普通的BST(BinarySearchTree)相比,它由于具有......
  • treap模板
    想不到我一把年纪了还要被回炉重造,感谢CP我记得好像写过一个平衡树的了?这次写是因为碰到作业题,是一个大号的贪心背包问题,思路不难整,但是需要特殊数据结构的加持其实就是......
  • 无旋树堆(FHQ-Treap)学习笔记
    简介无旋树堆(一般统称\(\text{FHQ-Treap}\)),是一种平衡树。可以用很少的代码达到很优秀的复杂度。前置知识:二叉搜索树\(\text{BST}\)\(\text{Treap}\)基本知识......
  • 【学习笔记】平衡树 Treap
    平衡树旋转Treap一个重要的等式treap=tree+heap解释:treap,即树堆,顾名思义,就是树+堆,而一般的,此处的树指BST(二叉搜索树)也就是说,treap是一棵BST,也是一个二叉堆,但二者的......
  • FHG无旋treap
    FHG无旋treap能做大部分splay能完成的操作,而且代码比较短,思路比较splay来说也更加易懂一些,是性价比很高的数据结构,推荐入手,视频可以看b站Agoh大佬的视频,讲的很清晰,但是spla......
  • 平衡树Splay与FHQ
    树剖的未来会补的(卑微)。这里想讲讲平衡树,因为看着高级,可以证明我学过OI。我们先了解下\(BST\),也就是平衡二叉树。他的概念是,对于每一个非叶子结点,他的左儿子一定小于当......