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

Java优先级队列heapify[重复]

韩豪
2023-03-14

一般来说,如果我理解正确的话,在给定列表和添加每个元素之间的“heapizing;o(n)”运行时是有区别的;o(lg n)。java遵循这种行为吗?如果不是,下面的问题可能无效。

下面的示例似乎创建了一个"min-heap"。

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。

共有2个答案

丁震博
2023-03-14

从java文档:

优先级队列的元素根据其自然顺序排序,或者根据使用的构造函数,由QUEUE CONSTRUCTION Time提供的比较器排序https://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html

因此,您必须在构建队列时提供订购策略。假设您试图拥有max-heap(以反向方式排序),那么队列构建将如下所示:-

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

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

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

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

比如:

 queue.addAll(List.of(5, 3, 2, 10));
姬俊远
2023-03-14

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

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

反复呼叫add。

您可以使用PriorityQueue#addAll()

 类似资料:
  • 注意:我知道可以用比较器创建优先级队列,然后重复调用Add。

  • 我有一个,名为,其中包含类型的对象。 您可以在所有车辆上调用该方法。 我要做的是排序,这样车辆被赋予更高的优先级,并被放在队列的前面。 我假设我必须在这里使用一个比较器,但不知道怎么做。

  • 我正在编写一个最小优先级队列和一个最大优先级队列,如下所示: 输入数组的数字将一个接一个地添加到队列中。然而,当数组[12,4,5,3,8,7]是一个样本输入,打印优先队列的输出是: MIN:[3.0, 4.0, 5.0, 12.0, 8.0, 7.0]MAX:[12.0, 8.0, 7.0, 3.0, 4.0, 5.0] 我定义的比较器有什么问题吗?提前感谢你的帮助。

  • 假设我实现了一个HashMap,其中字符被分配了一个值的ArrayList。 我已经在HashMap中创建了这些字符的PriorityQueue,但我希望能够根据此优先级删除这些字符: {a,b,c} {a,b}删除c,因为它的ArrayList中包含一个值,该值决定必须首先删除它。 对此最好的方法是什么?

  • 考虑下面的优先级类声明<代码>类优先级队列 我的想法: 我能想到的一件事是,这将强制优先级队列使用对象比较器,并且不会提供实现其自定义比较器的能力,因为类的用户可能希望基于某个不同的比较器构建队列。

  • 优先级队列(Priority Queue) 注:队列是一种特征为FIFO的数据结构,每次从队列中取出的是最早加入队列中的元素。但是,许多应用需要另一种队列,每次从队列中取出的应是具有最高优先权的元素,这种队列就是优先级队列(Priority Queue),也称为优先权队列。 1. 优先级队列的概念 1.1 优先级队列的定义 优先级队列是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优