【问题标题】:How to generate random priorities for Treap nodes?如何为 Treap 节点生成随机优先级?
【发布时间】:2015-04-28 02:56:41
【问题描述】:

在我在网络上看到的大多数示例中,假定存在某种外部随机数生成器会产生随机(不同!)优先级。

据我回忆,有一种方法可以实际随机生成优先级,并且当将它们插入到treap 中以解开可能的优先级时,会在旅途中发生冲突。

我有两个问题,那么:

  1. treaps 是否真的需要使其优先级完全不同,还是只需要比较可能最终被比较的节点的优先级?也就是说,如果我有两个优先级为 p 的节点,但我可以确保它们永远不会以任何方式相遇,那么让它们具有相同的优先级会有问题吗?
  2. 我应该如何在我的陷阱中生成和解开优先级?

谢谢

编辑:这是我在说什么的描述:

问题 8.12@Randomized Algorithms

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

【问题讨论】:

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


    【解决方案1】:
    1. 优先级可能相同。这样做不是最理想的,因此首选低冲突随机数生成器,但检查它比仅仅接受随机的冲突机会要慢。

    2. 当一个键第一次插入到treap 中时,它会被分配一个优先级。为了保留treap 的结构,您将确保树在每次操作后保持heap-ordered 的优先级。也就是说,在每次操作之后,您要确保每个节点的优先级大于或等于其子节点的优先级。

    【讨论】:

    • 您好,感谢您的回答。我很清楚第 2 点,但这并不是我的问题。让我试着改写一下。我听说过一种方法,您可以为节点的优先级生成随机位,如果您发现两个节点之间存在某种联系,您会在两个优先级上生成额外的位,直到联系结束。这个想法是您实际上确定在插入/删除节点时没有联系。我查看了网络,但没有看到它在任何地方提及。我在 Randomized Algorithms 书中看到它含糊地提到过,但我不太明白。
    • @devouredelysium 如果这确实是某些人提倡的方法,我认为它是次优的。优先级的存储是有限的——你不能简单地生成额外的随机位,因为节点中没有存储它们。如果您确实有额外的存储空间,您应该在插入节点时生成更多随机位。
    • @devouredelysium 你很困惑。您引用的段落根本没有表明实施策略。它是一种对 Treap 进行复杂性分析的数学工具 - 纯粹是理论上的。
    • 嗯.. 明天我会在课堂上直接解决这个问题。
    【解决方案2】:
    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
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      相关资源
      最近更新 更多