下面是带有大小装饰的 treap 的 python 代码,允许在特定索引处插入,并对整个连续部分进行重新排序。它改编自 C++ 代码,Kimiyuki Onaka 对 Hackerrank 问题的解决方案,“给我命令。” https://www.hackerrank.com/contests/zalando-codesprint/challenges/give-me-the-order(我不能保证这个改编没有错误——原始代码的副本可以在这个问题 https://stackoverflow.com/questions/37685498/how-does-a-treap-help-to-update-this-ordered-queue.)
import random
class Treap:
def __init__(self, value=None):
self.value = value
self.key = random.random()
self.size = 1
self.left = None
self.right = None
def size(t):
return t.size if t else 0
def update(t):
if t:
t.size = 1 + size(t.left) + size(t.right)
return t
def merge(a, b):
if not a:
return b
if not b:
return a
if a.key > b.key:
a.right = merge(a.right, b)
return update(a)
else:
b.left = merge(a, b.left)
return update(b)
def split(t, i):
if not t:
return None, None
if i <= size(t.left):
u, t.left = split(t.left, i)
return u, update(t)
else:
t.right, u = split(t.right, i - size(t.left) - 1)
return update(t), u
def insert(t, i, value):
left, right = split(t, i)
u = Treap(value)
return merge(merge(left, u), right)
def inorder(treap):
if not treap:
return
if treap.left:
inorder(treap.left)
print(treap.value)
if treap.right:
inorder(treap.right)
Output:
lst = ['itemX', 'itemY', 'itemZ']
idxs = [0, 0, 1]
t = None
for i in range(len(lst)):
t = insert(t, idxs[i], lst[i])
inorder(t)
"""
itemY
itemZ
itemX
"""