一般来说,如果我理解正确的话,在给定列表和添加每个元素之间的“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。
从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));
然而,假设我想构建一个“最大堆”,但是构造函数不允许我同时传入集合和比较器。在这种情况下,构建最大堆的唯一方法是创建一个实现可比的包装器类吗?
是的。此类不提供可以同时传入集合
和比较器
的构造函数。它将使用集合元素的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 优先级队列的定义 优先级队列是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优