「数据结构」优先级队列

个人主页:Ice_Sugar_7
所属专栏:Java数据结构
欢迎点赞收藏加关注哦!

优先级队列

  • 前言
  • 构造方法
  • 基本方法
  • 注意事项

前言

优先级队列底层是用堆实现的,关于堆的实现,之前的文章已经详细介绍过了,文章链接:二叉树1:堆的实现

构造方法

方法 功能
PriorityQueue() 创建一个空的优先级队列,默认容量是11
PriorityQueue(int initialCapacity) 创建一个初始容量为initialCapacity的优先级队列(注意:initialCapacity不能小于1,否则会抛IllegalArgumentException异常)
PriorityQueue(Collection c) 将一个包含指定类型元素的集合c添加到新建的PriorityQueue中
PriorityQueue(int initialCapacity, Comparator comparator) 使用比较器来初始化PriorityQueue(可以不传initialCapacity,此时使用默认容量)

注意:要将自定义类型的对象存放到PriorityQueue时,通常需要传入一个比较器,重写compare方法来定义对象之间的优先级顺序

在Java中,PriorityQueue默认是小堆,如果要将其转化为大堆,就要用比较器初始化PriorityQueue

public class MaxHeapExample {
    public static void main(String[] args) {
        // 创建一个Comparator,定义从大到小的比较规则
        Comparator<Integer> maxHeapComparator = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1; // 从大到小排序
            }
        };

        // 使用maxHeapComparator创建一个大堆PriorityQueue
        PriorityQueue<Integer> maxHeap = new PriorityQueue<>(maxHeapComparator);

        // 向大堆中添加元素
        maxHeap.add(3);
        maxHeap.add(1);
        maxHeap.add(5);
        maxHeap.add(2);

        // 此时PriorityQueue中的元素将按照大堆的规则排列
        // 输出:[5, 3, 1, 2]
        System.out.println(maxHeap);
    }
}

基本方法

方法 功能
boolean offer(E e) 插入元素e,插入成功返回true。如果e对象为空,则抛出NullPointerException异常(即不能插入null)
E peek() 获取优先级最高的元素(就是堆顶元素),如果优先级队列为空,返回null
E poll() 移除优先级最高的元素并返回,如果优先级队列为空,返回null
int size() 获取有效元素的个数
void clear() 清空
boolean isEmpty() 检测优先级队列是否为空,若为空,则返回true

注意事项

  • PriorityQueue中放置的元素必须要能够比较大小,不能插入无法比较大小的对象,否则会抛出ClassCastException异常
  • 不能插入null对象,否则会抛出NullPointerException
  • 没有容量限制,可以插入任意多个元素,因为其内部可以自动扩容
  • 插入和删除元素的时间复杂度为O(logN)
  • PriorityQueue默认情况下是小堆——即每次获取到的元素都是最小的元素

你可能感兴趣的:(Java数据结构,数据结构,java,开发语言)