我很早就想写一篇算法提升的文章了 ,奈何大一的时候, 有点摆烂 ,然后啊 。。。。
我来先写一个比较入门的知识fhq Treap,也称无旋 Treap,中文名:普通平衡树 。重要性就相当于cf里的线段树,可见重要性.(以后我都会先用 算法基础理解和算法逻辑,然后在进阶理解,最后用题目来结束文章)。
基础理解:
结合 二叉搜索树 (BST) 和 堆 (Heap) ,Treap 通过维护两个属性来保证其结构的特性:一个是节点的键值(用来保持二叉搜索树的特性),另一个是节点的优先级(用来保持堆的特性)。这确保了 treap 具有良好的随机性和平均时间复杂度。
算法逻辑:
-
插入:
- 将新节点插入到适当的位置以维持 BST 的性质。
- 然后将节点与其父节点比较,若优先级较大,则进行旋转以维持堆的性质。
-
删除:
- 删除节点时,首先定位节点。
- 若节点有两个子节点,则需要先进行旋转,使其只有一个子节点,再进行删除。
-
查找:
- 与普通二叉搜索树相同,通过比较键值进行查找
重点:
平衡树上的每个节点放两个值:树的权值val和堆的随机值key,对于val值,维护查找树的性 质,对于key值,维护堆的性质.
样例:
好,以上的基础知识点我推荐大家反复看,点个关注不迷路。
讲这么多,代码怎么写呢?
我先写分布在用样例全写:
其实 写完这个板子 我们就无形中解决了洛谷的一道题目 ,而且还是到蓝题,请大家不看我的样板,自行解决题目【模板】普通平衡树 - 洛谷。
言归正传:
大家耐心5分钟,看题目黑匣子 - 洛谷。
大家注意到 这里的推荐算法还多了一个线段树(貌似还是进阶版--主席树),好 这个是cf上蓝名的重要章节,我明后天会发表一篇,来带大家理解掌握。
这里本章节的fhq的treap就结束了,顺便说一下,这个代码有持久性,会了这个就本其他的就可以不学了,之后我刷到有splay的话,我再出一个章节。如果大家有啥问题可以搜我的洛谷名看我的源代码。