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】:但是,假设我想构建一个“最大堆”,但构造函数不允许我一起传入集合和比较器。在这种情况下,构建最大堆的唯一方法是创建一个实现可比较的包装类吗?
是的。此类不提供可以同时传入collection
和comparator
的构造函数。它将使用集合元素的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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章