如何为Treap节点生成随机优先级?

时间:2015-04-28 02:56:42

标签: algorithm data-structures binary-search-tree treap

在我在网上看到的大多数例子中,我们认为有某种外部随机数生成器会产生随机(不同的!)优先级。

从我记得的情况来看,有一种方法可以随机实际生成优先级,然后将它们插入到treap中以解决可能的优先级冲突。

我有两个问题,那么:

  1. treaps实际上是否需要将其优先级全部区分开来,或者只是节点的优先级可能最终被比较?也就是说,如果我有两个优先级为p的节点,但我可以确保它们永远不会以任何方式相遇,那么让它们具有相同的优先级会有问题吗?
  2. 我应该如何在我的行动中创造和解开优先事项?
  3. 谢谢

    编辑:这里描述的是我在谈论的内容:

    问题8.12 @ Randomized Algorithms

      

    现在让我们分析实现它所需的随机位数   treap的操作。假设我们统一选择每个优先级Pi   从单位区间[0,1]随机。然后,二进制表示   每个Pi的数据可以生成为(可能是无限的)序列   比特是无偏见的硬币翻转的结果。这个想法是   只生成此序列中所需的位数   解决不同优先事项之间的比较。假设我们有   只生成了二进制表示的一些前缀   treap T中元素的优先级。现在,插入一个   项目y,我们将其优先级Py与其他人进行比较'确定的优先事项   y应该如何旋转。将Py与某些PI进行比较。如果他们的   然后,当前的部分二进制表示可以解析比较   我们完了。除此以外。他们有相同的部分二进制   表示,我们不断为它们生成更多的位   首先是不同的。

2 个答案:

答案 0 :(得分:1)

  1. 优先事项可能相同。这样做是不理想的,因此首选低碰撞随机数生成器,但检查它比仅接受碰撞的随机机会要慢。

  2. 首次将密钥插入treap时,会为密钥分配优先级。为了保留treap的结构,您将确保每次操作后树的优先级保持heap-ordered。也就是说,在每次操作之后,您确保每个节点的优先级都大于或等于其子节点的优先级。

答案 1 :(得分:1)

  1. 您可以使用优先级执行任何操作,而不会影响正确性 - 它仍然是一个二进制搜索树。可以(但更复杂)重做运行时分析以处理优先级冲突的小概率而不牺牲O(log n)渐近界限。

  2. 这是比较运算符在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