【PriorityQueue 之 接口介绍and堆排序】

2024-01-27 00:52

本文主要是介绍【PriorityQueue 之 接口介绍and堆排序】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 常用接口介绍
    • PriorityQueue的性质
    • 插入/删除/获取优先级最高的元素
  • top-k问题:最大或最小的前k个数
  • 堆排序
  • 总结


常用接口介绍

PriorityQueue的性质

PriorityQueue默认都是小根堆

public class Test {public static void main(String[] args) {PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();priorityQueue.offer(10);priorityQueue.offer(5);priorityQueue.offer(6);System.out.println(priorityQueue.poll());//5System.out.println(priorityQueue.poll());//6}

如果要大堆,需要提供比较器
方法:直接实现Comparator接口,然后重写该接口中的compare方法即可

class Imp implements Comparator<Integer> {@Overridepublic int compare(Integer o1, Integer o2) {return o2.compareTo(o1);//如果是o1 o2,就是小根堆//02 01就是大根堆}
}
public class Test {public static void main(String[] args) {Imp imp = new Imp();//PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(imp);priorityQueue.offer(10);priorityQueue.offer(5);priorityQueue.offer(6);System.out.println(priorityQueue.poll());//10System.out.println(priorityQueue.poll());//6}
}

关于PriorityQueue的使用要注意:

  1. 使用时必须导入PriorityQueue所在的包,即:import java.util.PriorityQueue;
  2. PriorityQueue中放置的元素必须要能够比较大小,不能插入无法比较大小的对象,否则会抛出ClassCastException异常
  3. 不能插入null对象,否则会抛出NuliPointerException
  4. 没有容量限制,可以插入任意多个元素,其内部可以自动扩容
  5. 插入和删除元素的时间复杂度为O(log2N)
  6. PriorityQueue底层使用了堆数据结构
  7. PriorityQueue默认情况下是小堆—即每次获取到的元素都是最小的元素

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

函数名 功能介绍

  1. boolean offer(E e)
    插入元素e,插入成功返回true,如果e对象为空,抛出NullPointerException异常,时间复杂度 ,注意:空间不够时候会进行扩容
  2. E peek()
    获取优先级最高的元素,如果优先级队列为空,返回null
  3. E poll()
    移除优先级最高的元素并返回,如果优先级队列为空,返回null
  4. int size()
    获取有效元素的个数
  5. voidclear()
    清空
  6. boolean isEmpty()
    检测优先级队列是否为空,空返回true

top-k问题:最大或最小的前k个数

//把priorityQueue改成大根堆
class Imp implements Comparator<Integer> {@Overridepublic int compare(Integer o1, Integer o2) {return o2.compareTo(o1);//如果是o1o2,就是小根堆//02 01就是大根堆}
}
public class Test {public static int[] smallestK(int[] array, int k) {int [] ret = new int[k];if(arr == null || k <= 0){return ret;}PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(new Imp());//1.建立大小为k的大根堆O(k*logk)for (int i = 0;i < k;i++){priorityQueue.offer(array[i]);}//2.遍历剩下的元素for (int i = k;i< array.length;i++){int top = priorityQueue.peek();if (array[i] < top){priorityQueue.poll();priorityQueue.offer(array[i]);}}//把最小值放进ret数组//k*logNfor (int i = 0; i < k; i++) {ret[i] = priorityQueue.poll();}System.out.println(Arrays.toString(ret));return ret;}public static void main(String[] args) {int[] array = {1,3,15,7,19,10};int[] ret = smallestK(array,3);System.out.println(Arrays.toString(ret));}
}

堆排序

方法:

  1. 0下标的数和end的那个数换完之后,调用向下调整的方法,
    判断0下标和它的两个节点哪个大,大的数就换到0下标
  2. 然后end-- ,end就来到了倒数第二个的数,再让0下标的数和end交换,换完之后,调用向下调整的方法,把最大的数移到0下标
  3. 就这样循环下去,二叉树就会按照从小到大的顺序排
    //堆排序
public class TestHeap {public void heapSort(){int end = usedSize-1;while(end > 0){//将0下标和end交换swap(0,end);//向下调整siftDown(0,end);end--;}}

总结

关于PriorityQueue的知识就介绍到这里

这篇关于【PriorityQueue 之 接口介绍and堆排序】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/648576

相关文章

SpringBoot实现接口数据加解密的三种实战方案

《SpringBoot实现接口数据加解密的三种实战方案》在金融支付、用户隐私信息传输等场景中,接口数据若以明文传输,极易被中间人攻击窃取,SpringBoot提供了多种优雅的加解密实现方案,本文将从原... 目录一、为什么需要接口数据加解密?二、核心加解密算法选择1. 对称加密(AES)2. 非对称加密(R

Java中 instanceof 的用法详细介绍

《Java中instanceof的用法详细介绍》在Java中,instanceof是一个二元运算符(类型比较操作符),用于检查一个对象是否是某个特定类、接口的实例,或者是否是其子类的实例,这篇文章... 目录引言基本语法基本作用1. 检查对象是否是指定类的实例2. 检查对象是否是子类的实例3. 检查对象是否

Java对接Dify API接口的完整流程

《Java对接DifyAPI接口的完整流程》Dify是一款AI应用开发平台,提供多种自然语言处理能力,通过调用Dify开放API,开发者可以快速集成智能对话、文本生成等功能到自己的Java应用中,本... 目录Java对接Dify API接口完整指南一、Dify API简介二、准备工作三、基础对接实现1.

什么是ReFS 文件系统? ntfs和refs的优缺点区别介绍

《什么是ReFS文件系统?ntfs和refs的优缺点区别介绍》最近有用户在Win11Insider的安装界面中发现,可以使用ReFS来格式化硬盘,这是不是意味着,ReFS有望在未来成为W... 数十年以来,Windows 系统一直将 NTFS 作为「内置硬盘」的默认文件系统。不过近些年来,微软还在研发一款名

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接