使用二叉搜索树/链表实现双端优先级队列

时间:2016-09-29 16:38:42

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

我必须使用双向链接列表和二进制搜索树来实现双端优先级队列。

主要功能应该是getMin()和getMax()

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

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

2 个答案:

答案 0 :(得分:0)

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

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

当然,如果BST是平衡的,getMin和getMax将只是O(logn),否则它可以退化为O(n)

答案 1 :(得分:0)

  

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

你基本上要做的是按顺序搜索第一个更大的元素,而不能在O(1)中完成。线性搜索(这意味着逐个浏览元素)可能是执行此操作的最佳方式。如果您有大量列表并且希望专注于效率,则可以使用exponential searchinterpolation search (插值仅在您知道存储密钥的可能性时才有效)但您可以& #39; t比 O(loglog(n))更接近。

  

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

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

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