【问题标题】:Java Priority Queue heapify [duplicate]Java优先级队列heapify [重复]
【发布时间】: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。

【问题讨论】:

    标签: java priority-queue


    【解决方案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));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-20
        相关资源
        最近更新 更多