📜  优先队列倒序java(1)

📅  最后修改于: 2023-12-03 15:22:05.457000             🧑  作者: Mango

优先队列倒序Java

优先队列是一种数据结构,按照指定的优先级进行排序,每次弹出优先级最高的元素。在Java中,可以使用Java集合框架中的PriorityQueue实现优先队列。

为什么需要优先队列?

优先队列的一个重要应用是任务调度。比如某个操作系统中有多个任务需要执行,每个任务都有一个执行时间,怎样才能最快地执行完所有任务呢?我们可以使用优先队列,按照任务执行时间的先后顺序进行调度。

在一些算法中,我们需要按照某种顺序遍历图或者树,可以用优先队列来实现。另外,优先队列也可以用于某些贪心算法或者最小生成树算法的实现。

普通的优先队列

Java集合框架中的PriorityQueue默认是按照元素的自然顺序来排序的。比如,如果要生成一个整数类型的优先队列,可以这样写:

PriorityQueue<Integer> queue = new PriorityQueue<Integer>();

然后对queue中插入元素,每次取出的时候都是最小的元素:

queue.add(4);
queue.add(1);
queue.add(3);
queue.add(2);
while (!queue.isEmpty()){
    System.out.print(queue.remove()+" ");
}
//输出:1 2 3 4

PriorityQueue支持任何类型的元素,只要元素实现了Comparable接口或者我们自己提供了比较器(Comparator)。

倒序的优先队列

现在我们的需求变了,需要按照元素的相反顺序来排序,也就是要把最大的元素放在队首。怎样实现呢?

方法1:继承PriorityQueue并重写compare方法

我们可以通过自定义一个PriorityQueue类的子类,并重写其compare方法来实现。

class ReversePriorityQueue<E extends Comparable<E>> extends PriorityQueue<E>{
    public ReversePriorityQueue(){
        super();
    }

    public ReversePriorityQueue(int initialCapacity){
        super(initialCapacity);
    }

    public ReversePriorityQueue(int initialCapacity, Comparator<? super E> comparator){
        super(initialCapacity, Collections.reverseOrder(comparator));
    }

    public ReversePriorityQueue(Comparator<? super E> comparator){
        super(Collections.reverseOrder(comparator));
    }

    @Override
    public boolean add(E e) {
        return super.add(e);
    }

    @Override
    public boolean offer(E e) {
        return super.offer(e);
    }

    @Override
    public E peek() {
        return super.peek();
    }

    @Override
    public E poll() {
        return super.poll();
    }
}
方法2:提供自定义比较器

我们也可以在构造PriorityQueue的时候,提供一个Comparator来实现相反顺序的排序。首先,需要自定义一个Comparator,然后使用Collections.reverseOrder方法来反转该比较器:

Comparator<Integer> cmp = Collections.reverseOrder();
PriorityQueue<Integer> queue = new PriorityQueue<Integer>(cmp);
结论

通过继承PriorityQueue或者提供Comparator对象,我们可以实现任意顺序的优先队列,轻松应对各种需求。