在 java 中实现 PriorityQueue 的最佳方法是啥?

Posted

技术标签:

【中文标题】在 java 中实现 PriorityQueue 的最佳方法是啥?【英文标题】:What is the best way to implement a PriorityQueue in java?在 java 中实现 PriorityQueue 的最佳方法是什么? 【发布时间】:2017-04-28 18:28:12 【问题描述】:

我正在尝试从头开始实现我自己的 PriorityQueue 类(不使用任何现有的 Java 导入或库)。我知道我想使用最小堆数据结构。但我将堆可视化为二叉搜索树上的一种形式。我应该使用链表样式节点来实现这个最小堆,还是应该使用数组?两者的好处或首选方法是什么?或者我可以使用第三种选择吗?

【问题讨论】:

【参考方案1】:

在回答问题之前,请先看看这个。

但我将堆可视化为二叉搜索树上的一个表单。

这不是真的。堆是二叉树的一种形式,但不是二叉搜索树。 请看Difference between binary tree and binary search tree

现在,为了回答您的问题,我会选择某种数组形式。 原因是我在实现堆时需要经常用索引信息计算我的孩子或我的父母。通常,它发生在以下计算中。

给定n是当前节点的索引,索引从1开始(为简单起见)

父母指数 = n/2 左子索引 = 2n 右子索引 = 2n+1

当您使用 LinkedList.get(n) 执行此操作时,它是 O(n)。 在 ArrayList 或数组中,为 O(1)。

【讨论】:

【参考方案2】:

我能想到的最简单的实现是使用 LinkedList 或 ArrayList,它们根据优先级将自身保持在排​​序顺序中。然后,当需要从队列中删除某人时,您从列表的前面或后面删除(取决于您对数组的排序方式)。

【讨论】:

以上是关于在 java 中实现 PriorityQueue 的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在C中制作一个计算PriorityQueue中元素数量的函数

扩展 Ordering 以容纳类对象时出现 PriorityQueue 可变参数错误

Java队列Queue使用详解

在 Java 中实现单例模式的有效方法是啥? [关闭]

在 Java 中实现动态插件

如何在 Java 中实现 Chebyshev Type 2 LPF?