当前位置: 首页 > 知识库问答 >
问题:

Java PriorityQueue的底层数据结构

夹谷飞龙
2023-03-14

参考《Java:完整参考》一书中的“队列”接口扩展了“集合”接口。此外,“PriorityQueue”扩展了“AbstractQueue”类并实现了“Queue”接口。

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

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

共有2个答案

皇甫夕
2023-03-14

因为PriorityQueue只是一个带有Heapify技术的Queue,以保证在插入/删除期间的良好性能。

堆的意思是Heapify技术

为什么PriorityQueue使用Heapify技术?

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

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接口?

因为列表接口提供了优先级队列没有定义或需要的操作,比如获取(索引),而实现只是添加()轮询(),这与队列机制类似,队列机制是插入尾部并从头部轮询,而不是像ArrayListLinkedList那样的顺序插入,它们扩展了列表接口。而且无法通过索引位置获取值。

PriorityQueueQueue之间有什么区别?

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

使用PriorityQueue有什么好处?

最大的好处是,您可以定义最小PQ或最大PQ,并以排序顺序获得元素,以时间复杂度O(log2N)的升序或降序进行排序,这对于寻找最短路径、粒子碰撞检测等许多应用非常重要。

娄飞鸾
2023-03-14

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

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

换句话说:

List界面提供了一些有用的方法来处理列表。

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

PriorityQueue实现了一个List接口的方法,但使用起来不舒服。

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

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

 类似资料:
  • 问题内容: 我试图在一个明确的列表中回答两个问题: Redis的底层数据结构是什么? 每种类型的主要优点/缺点/用例是什么? 因此,我读过Redis列表实际上是用链接列表实现的。但是对于其他类型,我无法提取任何信息。同样,如果有人偶然发现了这个问题,而又对修改或访问不同数据结构的优缺点没有一个高层次的总结,那么他们将有完整的清单,列出 何时可以最佳地使用特定类型 进行引用。 具体来说,我希望概述所

  • 主要内容:1 Redis dict,1.1 扩缩容的条件,1.2 渐进式rehash操作,2 Redis ziplist,2.1 ziplist结构,2.2 entry结构,3 Redis quicklist详细介绍了Redis的底层数据结构:dict、ziplist、quicklist。 此前我们学习了常见的Reids数据类型,这些数据类型都需要底层的数据结构的支持,现在我们来看看Redis常见的底层数据结构:dict、ziplist、quicklist。 1 Redis dict dict就

  • 本文向大家介绍集合框架底层数据结构总结一下?相关面试题,主要包含被问及集合框架底层数据结构总结一下?时的应答技巧和注意事项,需要的朋友参考一下 Collection 1. List Arraylist: Object数组 Vector: Object数组 LinkedList: 双向链表(JDK1.6之前为循环链表,JDK1.7取消了循环) 2. Set HashSet(无序,唯一): 基于 Ha

  • 主要内容:一、内存管理,二、底层数据库内存的分配管理,三、具体的代码分析,四、总结一、内存管理 上一篇讨论的Mysql层的内存管理机制,这次讨论innodb层的内存管理。也就是说,分析一下内存和数据库引擎中的应用方式,其实从字面上都可以了解到数据库引擎需要内存怎么做?不外乎是两个硬件之间,即内存和硬盘之间如何缓冲,缓冲如何设置,缓冲的内存如何管理等等。而在内存应用中又有内存池的应用,内存的具体分配算法。这样,内存池、缓冲和具体的内存分配管理就形成了一个普遍的内存处理机制。换句话

  • 主要内容:线性表,树存储结构,图存储结构通过上节我们知道, 数据结构是学习数据存储方式的一门学科,那么,数据存储方式有哪几种呢?本节将对数据结构的学习内容做一个简要的总结。 数据结构大致包含以下几种存储结构: 线性表,还可细分为顺序表、链表、栈和队列; 树结构,包括普通树,二叉树,线索二叉树等; 图存储结构; 下面对各种数据结构做详细讲解。 线性表 线性表结构存储的数据往往是可以依次排列的,就像小朋友手拉手,每位学生的前面和后面都仅有一

  • 问题内容: 我有一个包含分层数据的表。 列“ ParentId”保存其父级的ID(“ ID”-关键列)。 删除一行时,我要删除所有子级(所有级别的嵌套)。 怎么做? 谢谢 问题答案: 当行数不太大时,erikkallen的递归方法起作用。 这是使用临时表收集所有子项的替代方法: 它从带有@delete_id的行开始,然后从那里开始。where语句用于防止递归;如果您确定没有任何内容,则可以将其忽略