java中的优先队列PriorityQueue——堆

        在 Java 中,PriorityQueue是一个基于优先级堆的无界优先队列。
一、主要特点
        元素存储:
        PriorityQueue可以存储任意类型的元素,但在使用时通常存储实现了Comparable接口的对象,或者在构造PriorityQueue时提供一个Comparator对象来定义元素的优先级顺序。
        队列中的元素按照优先级进行排序,优先级高的元素排在队列的前面。
        无界队列:
        它是无界的,这意味着可以向队列中添加任意数量的元素,而不会出现队列已满的情况。但是,如果不断向队列中添加元素而不取出,可能会导致内存耗尽。
二、常见方法
        添加元素:
        add(E e)和offer(E e)方法用于向队列中添加元素。如果添加成功,这两个方法都返回true;如果队列已满(在理论上不会发生)或者由于其他原因无法添加元素,add方法会抛出IllegalStateException异常,而offer方法则返回false。
        取出元素:
        remove()方法用于移除并返回队列的头元素,如果队列为空,则抛出NoSuchElementException异常。
        poll()方法也用于移除并返回队列的头元素,但如果队列为空,则返回null。

// 两个都是返回队列头元素并且不删除
        element()方法用于返回队列的头元素,但不删除它,如果队列为空,则抛出NoSuchElementException异常。
        peek()方法用于返回队列的头元素,但不删除它,如果队列为空,则返回null。
三、使用场景
        任务调度:
        可以将任务按照优先级放入PriorityQueue中,高优先级的任务先被执行。例如,在操作系统的任务调度中,可以根据任务的重要性和紧急程度来确定优先级。
        事件处理:
        在事件驱动的系统中,可以将事件按照优先级放入队列中,优先处理高优先级的事件。例如,在图形用户界面中,可以将用户输入事件、定时器事件等按照优先级进行处理。
        数据排序:
        虽然PriorityQueue本身不是一个排序算法,但可以利用它来实现部分排序。例如,可以将一组数据放入PriorityQueue中,然后逐个取出元素,这样就可以得到一个按照优先级排序的序列。

在 Java 中,PriorityQueue 默认情况下是小根堆

        PriorityQueue 是一个基于优先级的队列,它使用堆数据结构来实现。在默认情况下,它会按照元素的自然顺序进行排序,对于数值类型来说,较小的值具有较高的优先级,因此可以认为它是小根堆。

        如果想要实现大根堆,可以通过在创建 PriorityQueue 时传入自定义的比较器来实现。例如:

import java.util.PriorityQueue;

public class PriorityQueueExample {
    public static void main(String[] args) {
        PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);
        maxHeap.add(5);
        maxHeap.add(3);
        maxHeap.add(7);
        System.out.println(maxHeap.poll());
    }
}

        在这个例子中,通过传入一个比较器,使得较大的值具有较高的优先级,从而实现了大根堆。

复杂度分析

        在 Java 中,PriorityQueue是一个基于优先级堆的数据结构。以下是其主要操作的时间复杂度分析:
一、插入元素(offer 方法)
        时间复杂度为O(logn),其中n是队列中的元素个数。
        插入元素时,需要将新元素放入堆的末尾,然后通过上浮操作调整堆的结构以满足堆的性质。上浮操作最多需要比较和交换logn次,因为堆是一个完全二叉树,高度为logn。
二、获取并删除最小元素(poll 方法)
        时间复杂度也为O(logn)。
        删除最小元素时,需要将堆的根节点(最小元素)与堆的最后一个元素交换,然后删除最后一个元素,接着通过下沉操作调整堆的结构。下沉操作同样最多需要比较和交换logn次。
三、查看最小元素(peek 方法)
        时间复杂度为O(1)。
        因为最小元素始终位于堆的根节点,可以直接返回,无需进行任何额外的计算。
综上所述,PriorityQueue在插入和删除元素时具有较好的时间复杂度,适用于需要按照优先级进行动态排序的场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值