FHQ Treap不是通过旋转来保持平衡的,而是通过两个函数split和merge。顾名思义,split就是分裂,merge就是合并。当然,从最底层的原理来看,还不是这两个函数。FHQ Treap中的Treap代表Tree + Heap,也就是说,FHQ Treap会按二叉搜索树一样根据键值排序结点,并且随机赋给每个结点一个优先级,按照二叉堆的顺序排序结点(这...
数据结构-FHQ Treap(也许是全网唯一一个认真给你画图解的) 平衡树-FHQTreap FHQTreap,又称非旋转Treap,顾名思义,是FHQ发明的不用旋转来维护随机key值的小根堆性质的平衡树。 树的结点 为了方便树的各种操作,本蒟蒻的FHQ每个节点只存一个数而不是相等的所有数,保证LC<now<=RC,代码是这样的 1structNode{2Node...
fhq Treap 学习笔记 Treap是一种二叉平衡树,而Treap=BST+Heap。 但普通的Treap每次都要旋来旋去的,泰麻饭啦!于是出现了fhqtreap,也就是无旋treap。 fhqtreap整体是拥有二叉搜索树的性质,但是它的每一个节点都会有一个附加权值,它的附加权值是符合堆的性质。附加权值需要随机,这样能让他尽量平衡,防止成一条链(...
——fhq treap 前置知识:二叉排序树treap(https://www.luogu.org/blog/ztz11/pinghengshu-bst)了解什么是函数式编程(https://www.sohu.com/a/222320820_355140)本文代码均未经编译,如有错误请指出。826755370-“平衡树好烦啊,转来转去的,而且treap遇到区间序列问题就gg。 有两种类型的划分,一种是权重划分,另...
平衡树学习笔记 1:fhq Treap(非旋 Treap) 正文开始前首先 %%% fhq 大佬。 众所周知,平衡树是一种非常猥琐码量堪忧的数据结构。 他的祖先是一种叫做二叉搜索树 (\(BST\)) 的东东。 话说二叉搜索树是个什么玩意呢? 二叉搜索树: 显而易见,这是一棵二叉树 (逃),它的每个节点上有一个需要我们维护的值,我...
-“有一种不用旋转的treap,叫fhq treap,可以解决区间序列问题。” 正文 约定 我们做出以下约定: 分裂 分裂有两种,一种是权值分裂,一种是排名分裂。我们先讲权值分裂。如图,当我们遍历到一个节点时,如果它的权值小于k,那么它的左子树会被分到左边的树里,然后我们遍历它的右儿子,如果大于k,则把它的右子树分到...
简单来说就是看看哪部分是当前需要的区间, 然后再递归处理剩下的那个区间. 这一坨东西就像rotate之于旋转式平衡树,rebuild之于替罪羊树一样是对任何FHQ Treap都一样的(就是可以复制粘贴的意思. 证明 对正确性的证明: 如果原树满足堆的性质的话, 那么明显分裂后的两棵子树也满足堆的性质(因为父子关系并没有变化...
FHQ Treap 这个东西的学名应该是叫做fhq treap,应该是treap的强化版。 整个数据结构中只有两个操作: 1.分离(split) 就是把一棵树分成两个树 2.合并(merge)把两棵树合成一棵树 对于FHQ 的两种操作的原理以及实现, 我在这里就不去赘述, 大家可以去看一下远航之曲写的博客 ...
平衡树(Splay、fhq Treap) Splay Splay(伸展树)是一种二叉搜索树。 其复杂度为均摊\(O(n\log n)\),所以并不可以可持久化。 Splay的核心操作有两个:rotate和splay。 pushup: 上传信息,比如区间和、子树大小... rotate: rotate实现把一个节点\(x\)转到它的父亲\(y\)的位置。
fhq treap可以可持久化。如图,每次split和merge走到的所有点都新建一个即可。注意下传标记也要新建点。 三道裸题 1.洛谷P3369 普通disco平衡树(https://www.luogu.org/problemnew/show/P3369) 就是把上面的东西综合在一起。代码: 本题还有一种树状数组解法:树状数组解法。(https://www.luogu.org/blog/Chan...