在我在网上看到的大多数例子中,我们认为有某种外部随机数生成器会产生随机(不同的!)优先级。
从我记得的情况来看,有一种方法可以随机实际生成优先级,然后将它们插入到treap中以解决可能的优先级冲突。
我有两个问题,那么:
p
的节点,但我可以确保它们永远不会以任何方式相遇,那么让它们具有相同的优先级会有问题吗?谢谢
编辑:这里描述的是我在谈论的内容:
问题8.12 @ Randomized Algorithms
现在让我们分析实现它所需的随机位数 treap的操作。假设我们统一选择每个优先级Pi 从单位区间[0,1]随机。然后,二进制表示 每个Pi的数据可以生成为(可能是无限的)序列 比特是无偏见的硬币翻转的结果。这个想法是 只生成此序列中所需的位数 解决不同优先事项之间的比较。假设我们有 只生成了二进制表示的一些前缀 treap T中元素的优先级。现在,插入一个 项目y,我们将其优先级Py与其他人进行比较'确定的优先事项 y应该如何旋转。将Py与某些PI进行比较。如果他们的 然后,当前的部分二进制表示可以解析比较 我们完了。除此以外。他们有相同的部分二进制 表示,我们不断为它们生成更多的位 首先是不同的。
答案 0 :(得分:1)
优先事项可能相同。这样做是不理想的,因此首选低碰撞随机数生成器,但检查它比仅接受碰撞的随机机会要慢。
首次将密钥插入treap时,会为密钥分配优先级。为了保留treap的结构,您将确保每次操作后树的优先级保持heap-ordered。也就是说,在每次操作之后,您确保每个节点的优先级都大于或等于其子节点的优先级。
答案 1 :(得分:1)
您可以使用优先级执行任何操作,而不会影响正确性 - 它仍然是一个二进制搜索树。可以(但更复杂)重做运行时分析以处理优先级冲突的小概率而不牺牲O(log n)渐近界限。
这是比较运算符在Python中的样子。最初优先级是[]
,空列表,并且如上所述懒惰地填充位。我使用的是比特列表;为了提高效率,将它们打包成更大的整体类型是明智的。
import random
def less(lst1, lst2):
j = 0
while True:
if j >= len(lst1):
lst1.append(random.randrange(2)) # random bit
if j >= len(lst2):
lst2.append(random.randrange(2))
if lst1[j] != lst2[j]:
return lst1[j] < lst2[j]
j += 1