【问题标题】:Implementation of Double Ended Priority Queue using Binary Search Tree/Linked List使用二叉搜索树/链表实现双端优先级队列
【发布时间】:2017-02-08 02:22:45
【问题描述】:

我必须使用双向链表和二叉搜索树来实现一个双向优先级队列。

主要函数应该是getMin()和getMax()

  1. 使用双向链表: 在 O(1) 中获取最小和最大元素的想法是在列表的一侧插入小元素,在另一侧插入更大的元素,但是每次插入元素都会出现问题(它不会是 O(1) ) 有没有更好的实现方式?

  2. 使用 BST: 我无法理解如何在 BST 中实现 getMin() 和 getMax()。

【问题讨论】:

    标签: algorithm data-structures linked-list binary-search-tree deque


    【解决方案1】:

    普通优先级队列通常使用堆来实现,因此我们可以在 O(1) 中轻松获取最高值并在 O(logn) 中插入新元素。我怀疑是否有一种方法可以使用具有相同渐近复杂性的双向链表来实现优先级队列,更不用说双端优先级队列了(不过我可能是错的)。使用 BST,我们可以在 O(logn) 中完成这两个操作:

    • 插入和删除与您通常的 BST 中的相同
    • 要获取最小值,从根开始一直遍历到左侧,直到当前节点没有左子节点。您访问的最后一个节点包含最小值
    • 要获取最大值,从根开始遍历,一直向右,直到当前节点没有右子节点。您访问的最后一个节点包含最大值

    当然,getMin和getMax只有在BST平衡的情况下才会为O(logn),否则会退化为O(n)

    【讨论】:

      【解决方案2】:

      每次插入元素(不会是O(1)) 有没有 更好的实现方式?

      您基本上要做的是按顺序搜索第一个较大的元素,这在 O(1) 中无法完成。线性搜索(意味着逐个遍历元素) 可能是最好的方法。如果您有大量列表并希望专注于效率,您可以使用 exponential searchinterpolation search (只有在您知道存储密钥的概率时,插值才有效)但您无法接近比 O(loglog(n))

      我无法理解如何实现 getMin() 和 BST 中的 getMax()。

      如果您不允许向 BST 添加任何其他结构,那么获取最小值和最大值的唯一方法是遍历 Lucas Sampaio 已经提到的。

      但是,存储对当前最小值和最大值的引用会很有帮助,这样您就可以更快地访问它们

      【讨论】:

      • 在链表上进行指数搜索或插值搜索是毫无意义的,除非比较与遍历相关的成本非常高。
      • @Jim Mischel 你说得对,我只说复杂的方法,而不是最实用的方法
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多