java的 的priorityqueue 默认是最小堆吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java的 的priorityqueue 默认是最小堆吗相关的知识,希望对你有一定的参考价值。

默认是最小堆。可以自己设置一个比较器转变为最大堆

   // 如果不是整数就自己修改比较处的代码即可
   PriorityQueue pq = new PriorityQueue(new Comparator() 
       @Override               
       public int compare(Object o1, Object o2) 
           if ((Integer) o1 <= (Integer) o2) 
               return 1;
            else 
               return -1;
           
       
   );

参考技术A 应该是的,参考如下内容:
注意1:该队列是用数组实现,但是数组大小可以动态增加,容量无限。
注意2:此实现不是同步的。不是线程安全的。如果多个线程中的任意线程从结构上修改了列表, 则这些线程不应同时访问 PriorityQueue 实例,这时请使用线程安全的PriorityBlockingQueue 类。
注意3:不允许使用 null 元素。
注意4:此实现为插入方法(offer、poll、remove() 和 add 方法)提供 O(log(n)) 时间;
为 remove(Object) 和 contains(Object) 方法提供线性时间;
为检索方法(peek、element 和 size)提供固定时间。
注意5:方法iterator()中提供的迭代器并不保证以有序的方式遍历优先级队列中的元素。
至于原因可参考下面关于PriorityQueue的内部实现
如果需要按顺序遍历,请考虑使用 Arrays.sort(pq.toArray())。
注意6:可以在构造函数中指定如何排序。如:
PriorityQueue()
使用默认的初始容量(11)创建一个 PriorityQueue,并根据其自然顺序来排序其元素(使用 Comparable)。
PriorityQueue(int initialCapacity)
使用指定的初始容量创建一个 PriorityQueue,并根据其自然顺序来排序其元素(使用 Comparable)。
PriorityQueue(int initialCapacity, Comparator comparator)
使用指定的初始容量创建一个 PriorityQueue,并根据指定的比较器comparator来排序其元素。
注意7:此类及其迭代器实现了 Collection 和 Iterator 接口的所有可选 方法。
PriorityQueue的内部实现
PriorityQueue对元素采用的是堆排序,头是按指定排序方式的最小元素。堆排序只能保证根是最大(最小),整个堆并不是有序的。
方法iterator()中提供的迭代器可能只是对整个数组的依次遍历。也就只能保证数组的第一个元素是最小的。
实例1的结果也正好与此相符。

挑战程序设计竞赛(算法和数据结构)——10.5 Java 中对应C++ STL中的PriorityQueue类的使用

import java.util.Comparator;
import java.util.Queue;
import java.util.PriorityQueue;
public class PriorityQueueDemo 
    public static void main(String[] args) 
        //默认是从小到大排序,这边需要对排序的方法进行重载,按照从大到小来排
        Queue<Integer> PQ = new PriorityQueue<Integer>(new Comparator<Integer>() 
            @Override
            public int compare(Integer o1, Integer o2) 
                return o2.compareTo(o1);
            
        );//多态形式导入,之前多次编译报错是因为默认使用java.lang.Object下的PriorityQueue,而非java.util.PriorityQueue<E>
        PQ.add(1);
        PQ.add(8);
        PQ.add(3);
        PQ.add(5);

        System.out.println(PQ.poll());
        System.out.println(PQ.poll());

        PQ.add(11);
        System.out.println(PQ.poll());

        System.out.println(PQ.poll());
    


输出;

8
5
11
3

以上是关于java的 的priorityqueue 默认是最小堆吗的主要内容,如果未能解决你的问题,请参考以下文章

为啥有些人使用 PriorityQueue 覆盖比较器函数来实现 minheap,即使 Java 中的 PQ 默认是最小堆?

源码阅读(13):Java中主要的QueueDeque结构——PriorityQueue集合(中)

Java的优先队列PriorityQueue详解

java同步阻塞队列之DelayQueue实现原理,PriorityQueue原理

util之PriorityQueue

挑战程序设计竞赛(算法和数据结构)——10.5 Java 中对应C++ STL中的PriorityQueue类的使用