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

时间:2017-04-28 18:28:12

标签: java heap priority-queue min-heap

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

2 个答案:

答案 0 :(得分:1)

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

  

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

事实并非如此。堆是二叉树的一种形式,但不是二叉搜索树。 请参阅Difference between binary tree and binary search tree

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

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

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

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

答案 1 :(得分:0)

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