【问题标题】:Underlying DataStructure of Java PriorityQueueJava PriorityQueue 的底层数据结构
【发布时间】:2021-06-02 13:17:15
【问题描述】:

参考书Java: The Complete Reference,“Queue”接口扩展“Collection”接口。此外,“PriorityQueue”扩展了“AbstractQueue”类,实现了“Queue”接口。

此外,根据 Internet 上的许多文章,Heaps 提供了最有效的优先级队列实现,同时考虑了 O(logn) 中的插入和删除。作为完全二叉树,堆可以简单地在数组/列表上实现。

我的问题是,如果堆对优先队列有效,那么为什么PriorityQueue 使用Queue 接口?为什么不使用List 接口?否则,实现的基本概念/想法是什么,提供与堆相同(或更好)的时间复杂度?

【问题讨论】:

  • 这些是完全不同的界面。 List 是 wlog。 unorderend 并允许在随机索引处插入和删除。 Queues 是有序的,仅提供添加元素的方法,以便不违反队列属性并查看和弹出最顶部的元素。
  • 因为它实现了一个队列,它是你添加到末尾并从开头获取的东西,而不是一个列表,它是你在中间迭代、添加和删除的东西,等等。接口没有理由需要反映底层实现。
  • 您应该尝试了解实现接口和内部使用数据结构之间的区别。

标签: java collections queue heap priority-queue


【解决方案1】:

接口是“契约”,它确保实现它们的类将提供某些“行为”——方法。

因此,客户端代码(例如,将使用 PriorityQueue 的代码)将保证此类将具有可能仅来自 Queue 实现的预期行为。

换句话说:

List 接口具有对处理列表有用的方法。

Queue 接口具有对处理队列有用的方法。

实现List 接口的方法的PriorityQueue 使用起来会很不舒服。

反之亦然,想象一下实现Queue 接口的ArrayList - 使用这样的东西会很混乱。

与您的问题相关的更多信息: Queue 接口可能有多种实现——在数组上、在ArrayListLinkedList 上,时间复杂度不同等等,但它们都将提供Queue 接口的相同方法集。

【讨论】:

    【解决方案2】:

    因为PriorityQueue 只是一个Queue,使用Heapify 技术来保证插入/删除期间的良好性能。

    Heap 表示 Heapify 技术

    为什么PriorityQueue 使用Heapify 技术?

    • Heapifying是一种插入/删除的方法,最坏情况O(log2 N)

    PriorityQueue的继承层次是什么?

    public class PriorityQueue<E> extends AbstractQueue<E> {}
    
    public abstract class AbstractQueue<E> extends AbstractCollection<E> {}
    
    public abstract class AbstractCollection<E> implements Collection<E> {}
    

    List的继承层次是什么?

    public interface List<E> extends Collection<E> {}
    

    为什么PriorityQueue 没有扩展List 接口?

    因为List接口提供了PriroityQueue未定义或不需要的操作,如get(index),而实现只是add()poll(),类似于插入尾部和轮询的队列机制从头部开始,而不是像 ArrayListLinkedList 这样的顺序插入,它们扩展了 List 接口。并且无法获取索引位置的值。

    PriorityQueueQueue 有什么区别?

    PriorityQueue 使用“Heapify”技术,可以是 Min PQ 或 Max PQ,您可以在声明 PriorityQueue 的构造函数时简单地定义,而 Queue 只是将值添加到尾部和从头部投票。

    使用PriorityQueue有什么好处?

    最大的好处是您可以定义 Min PQ 或 Max PQ 并以时间复杂度 O(log2 N) 的升序或降序排序元素,并且这对于许多应用很重要,例如寻找最短路径、粒子碰撞检测等。

    【讨论】:

      猜你喜欢
      • 2014-06-26
      • 2014-03-26
      • 2010-10-29
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      • 2011-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多