前言
学完了替罪羊树,我决定再去学一学 T r e a p Treap Treap。一直听说 T r e a p Treap Treap很难,我也花了挺久才学会。
简介
T r e a p Treap Treap这个名字真的挺有内涵:
T r e e \color{red}{Tree} Tree+ H e a p \color{blue}{Heap} Heap= T r e \color{red}{Tre} Tre+ e a p \color{blue}{eap} eap= T r e a p \color{red}{Tr}\color{purple}{e}\color{blue}{ap} Treap
这很形象地告诉了我们: T r e a p Treap Treap是 T r e e Tree Tree(二叉搜索树)与 H e a p Heap Heap(堆)的结合体,这也是 T r e a p Treap Treap能够平衡的关键。
T r e a p Treap Treap平衡的方法
T r e a p Treap Treap为什么能够平衡?它与普通的 B S T BST BST有什么区别?
主要就在于,它比 B S T BST BST多了一个优先级的设定。
首先, T r e a p Treap Treap的节点是满足 B S T BST BST性质的。其次, T r e a p Treap Treap的每一个节点还有一个优先级,而这些优先级又是满足堆性质的。这就能让 T r e a p Treap Treap的节点保持一种随机的状态,而不会被数据卡成链(当然,脸黑也没办法)。
至于如何让它同时满足 B S T BST BST性质和堆性质,这放在后面再讲。
那么,该怎么确定优先级呢?
很简单,随机即可。
不过,直接用 C + + C++ C++自带的 r a n d ( ) rand() rand()又慢又容易被卡,所以推荐手写 r a n d ( ) rand() rand(),下面的代码仅供参考:
inline int Rand()
{
static ull r=2333;//static不能少,r的初值可以自己定
return (r*=233333)%=2147483647;//每次r乘上的数也可以自己定
}
T r e a p Treap Treap的基础操作
-
旋转
旋转应该是 T r e a p Treap Treap最重要也是最核心的操作了。
T r e a p Treap