像红黑树和AVL树一样,Treap是平衡二进制搜索树,但不能保证高度为O(Log n)。这个想法是利用随机化和二进制堆属性来保持平衡的可能性很高。搜索,插入和删除的预期时间复杂度为O(Log n)。
Treap的每个节点都维护两个值。
1)键遵循标准的BST排序(左侧较小,右侧较大)
2)优先级遵循Max-Heap属性的随机分配值。
挖矿的基本操作:
像其他自平衡二叉搜索树一样,Treap在插入和删除期间使用旋转来维护Max-Heap属性。
T1, T2 and T3 are subtrees of the tree rooted with y (on left side)
or x (on right side)
y x
/ \ Right Rotation / \
x T3 – – – – – – – > T1 y
/ \ < - - - - - - - / \
T1 T2 Left Rotation T2 T3
Keys in both of the above trees follow the following order
keys(T1) < key(x) < keys(T2) < key(y) < keys(T3)
So BST property is not violated anywhere.
搜索(x)
执行标准的BST搜索以找到x。
插入(x):
1)创建键等于x并且值等于随机值的新节点。
2)执行标准的BST插入。
3)使用旋转来确保插入的节点的优先级遵循max heap属性。
删除(x):
1)如果要删除的节点是叶子,则将其删除。
2)否则用负无穷(-INF)替换节点的优先级,并进行适当的旋转以使节点下降到一片叶子。
有关更多详细信息,请参阅Treap搜索的实现,插入和删除。
参考:
https://zh.wikipedia.org/wiki/陷阱
https://courses.cs.washington.edu/courses/cse326/00wi/handouts/lecture19/sld017.htm