一、简介
无旋Treap(fhq_treap),是一种不用旋转的treap,其代码复杂度不高,应用范围广(能代替普通treap和splay的所有功能),是一种极其强大的平衡树。
无旋Treap是一个叫做范浩强的大佬发明的(快%啊!)
在我们一起学习无旋Treap之前,本蒟蒻有几句活想说:
1.无旋Treap我个人认为是最容易理解的一种平衡树,而且编程复杂度不高,功能还那么强大。
我一开始学平衡树的时候是先从普通的带旋转的Treap开始学的。那种Treap,我现在都没搞懂什么左旋右旋究竟是怎么一回事。
我当时真的以为我这辈子都不指望学会平衡树了,直到djq大佬(快%!)告诉了我这种很美妙的数据结构。
我真就不明白了,为什么那么多人愿意去学普通的Treap而不学无旋Treap。无旋Treap更容易理解,最主要的是他与普通的Treap相比能可持久化!(尽管我不会)
所以,在大家学习完无旋Treap以后,本蒟蒻请诸君不妨推广一下无旋Treap,造福更多的Oier。
2.关于无旋Treap和其他平衡树的比较:(这个建议大家学完无旋Treap再来看,可能感触会更深刻一些)
与AVL相比:旋转操作真的很浪费时间,最坏情况下复杂度为O(log n),而且AVL树难写无比,不适合运用于算法竞赛。
与普通Treap相比:参见第一条
与splay相比:基本上可以代替splay的所有功能,但是在处理LCT问题上没有splay优秀
与rbt(红黑树相比):红黑树特别难写是众所周知的。
与sbt相比:sbt是我认为的最强大的平衡树。但是无旋Treap中的merge、split操作的应用的广泛(可持久化Treap维护Hash之类的)是sbt做不到的。
二、Treap
什么是Treap?
Treap=Tree+heap
相信大家都知道二叉堆吧。父节点的权值比子节点都要大(或小)
而Treap,则是在BST(二叉查找树)的基础上,添加二叉堆中的这个元素。
Treap与heap的区别是,heap是完全二叉树,而Treap不是。
下面的
三、核心操作