Java优先级队列heapify [重复]

Posted

技术标签:

【中文标题】Java优先级队列heapify [重复]【英文标题】:Java Priority Queue heapify [duplicate] 【发布时间】:2021-11-28 05:58:17 【问题描述】:

一般来说,如果我理解正确,“heapifying;o(n)”给定列表与添加每个单独元素之间存在运行时差异; o(lg n)。 java是否遵循这种行为?如果不是以下问题可能无效。

以下示例似乎创建了一个“最小堆”。

List<Integer> myList = List.of(4,3,10,1);
PriorityQueue<Integer> queue = new PriorityQueue<>(myList);

但是,假设我想构建一个“最大堆”,但构造函数不允许我一起传入集合和比较器。在这种情况下,构建最大堆的唯一方法是创建一个实现可比较的包装类吗?

 class Wrapper implements Comparable<Wrapper> 
 ...
 @Override
 int compareTo(Wrapper o) // define rule here...
 

 List<Integer> val = List.of(5,3,2,10);
 List<Wrapper> wrappedVal = val.stream().map(Wrapper::new).collect(Collectors.toList());

 PriorityQueue<Wrapper> queue = new PriorityQueue<>(wrappedVal); 

注意:我知道可以使用比较器创建优先级队列,然后重复调用 add。

【问题讨论】:

【参考方案1】:

但是,假设我想构建一个“最大堆”,但构造函数不允许我一起传入集合和比较器。在这种情况下,构建最大堆的唯一方法是创建一个实现可比较的包装类吗?

是的。此类不提供可以同时传入collectioncomparator 的构造函数。它将使用集合元素的compareTo 方法,所以正如您所做的那样,您需要一个Wrapper(但这似乎有点不必要?)。

反复调用add。

您可以使用PriorityQueue#addAll()

【讨论】:

【参考方案2】:

来自 java 文档:

优先级队列的元素根据其自然顺序进行排序,或者通过在 QUEUE CONSTRUCTION TIME 提供的 Comparator 进行排序,具体取决于使用的构造函数 https://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html

因此您必须在构建队列时提供排序策略。假设您正在尝试使用最大堆(以相反的方式排序),那么队列构造将如下所示:-

Queue<Integer> queue = new PriorityQueue<>(new YourCustomComparator())

或者,如果您只是处理整数,您可以利用自定义整数:

Queue<Integer> queue = new PriorityQueue<>(Collections.reverseOrder());

这一步只是创建队列。现在如何添加元素?在这里,您可以使用各种方法签名。假设您有可用的列表,那么您可以简单地将它们传递给 addAll 方法。

类似这样的:

 queue.addAll(List.of(5, 3, 2, 10));

【讨论】:

以上是关于Java优先级队列heapify [重复]的主要内容,如果未能解决你的问题,请参考以下文章

优先队列

Java集合与数据结构——优先级队列(堆)

JS优先队列排序。出队时,先找出优先级最高的元素,再按照先进先出出队。

C语言实现一个优先队列

堆(Heap)和有优先队列(Priority Queue)

python[数据]--队列,堆,优先级队列