优先级队列——堆

优先级队列是一个数据结构,支持返回最高优先级对象和添加新对象操作。它基于堆实现,插入、删除和获取操作的时间复杂度为O(logn)。在Java中,PriorityQueue接口用于实现优先级队列,要求元素可比较大小,不支持null插入。堆是一种特殊的完全二叉树,分为大顶堆和小顶堆。堆常用于解决top-k问题和实现堆排序等。
摘要由CSDN通过智能技术生成

优先级队列
数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。这种数据结构就是优先级队列(Priority Queue)。

PriorityQueue接口:

static void TestPriorityQueue(){
   
 	// 创建一个空的优先级队列,底层默认容量是11
 	PriorityQueue<Integer> q1 = new PriorityQueue<>();
 	// 创建一个空的优先级队列,底层的容量为initialCapacity
 	PriorityQueue<Integer> q2 = new PriorityQueue<>(100);
 	ArrayList<Integer> list = new ArrayList<>();
	list.add(4);
 	list.add(3);
 	list.add(2);
 	list.add(1);
 	// 用ArrayList对象来构造一个优先级队列的对象
 	// q3中已经包含了三个元素
 	PriorityQueue<Integer> q3 = new PriorityQueue<>(list);
 	System.out.println(q3.size());
 	System.out.println(q3.peek());
 }

特性:

  1. 使用时必须导入PriorityQueue所在的包;
  2. PriorityQueue中放置的元素必须要能够比较大小,不能插入无法比较大小的对象,否则会抛出ClassCastException异常;
  3. 不能插入null对象,否则会抛出NullPointerException;
  4. 没有容量限制,可以插入任意多个元素,其内部可以自动扩容;
  5. 插入和删除元素的时间复杂度为O(logn);
  6. PriorityQueue底层使用了堆数据结构。

插入/删除/获取优先级最高的元素:

static void TestPriorityQueue2(){
   
 	int[] arr = {
   4,1,9,2,8,0,7,3,6,5};
 	// 一般在创建优先级队列对象时,如果知道元素个数,建议就直接将底层容量给好
 	// 否则在插入时需要不多的扩容
 	// 扩容机制:开辟更大的空间,拷贝元素,这样效率会比较低
 	PriorityQueue<Integer> q = new PriorityQueue<>(arr.length);
 	for (int e: arr) {
   
 		q.offer(e);
 	}
 	System.out.println(q.size()); // 打印优先级队列中有效元素个数
 	System.out.println(q.peek()); // 获取优先级最高的元素
 	// 从优先级队列中删除两个元素之和,再次获取优先级最高的元素
 	q.poll();
 	q.poll();
 	System.out.println(q.size()); // 打印优先级队列中有效元素个数
 	System.out.println(q.peek()); // 获取优先级最高的元素
 	q.offer(0);
 	System.out.println(q.peek
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值