news 2026/7/26 23:36:22

Java 数据结构 优先级队列(堆)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 数据结构 优先级队列(堆)

目录

常用方法

常⽤接⼝介绍


常用方法

常⽤接⼝介绍

于PriorityQueue的使⽤要注意

1. PriorityQueue中放置的元素必须要能够⽐较⼤⼩,不能插⼊⽆法⽐较⼤⼩的对象,否则会抛出 ClassCastException异常

2. 不能插⼊null对象,否则会抛出NullPointerException

3. 没有容量限制,可以插⼊任意多个元素,其内部可以⾃动扩容

4. 插⼊和删除元素的时间复杂度为

5. PriorityQueue底层使⽤了堆数据结构

6. PriorityQueue默认情况下是⼩堆---即每次获取到的元素都是最⼩的元素

优先级队列的构造

// 创建⼀个空的优先级队列,底层默认容量是11 PriorityQueue<Integer> q1 = new PriorityQueue<>(); // 创建⼀个空的优先级队列,底层的容量为initialCapacity PriorityQueue<Integer> q2 = new PriorityQueue<>(100); // // list中已经包含了三个元素 PriorityQueue<Integer> q3 = new PriorityQueue<>(list);

三种构造方法的底层调用

public PriorityQueue() { this(DEFAULT_INITIAL_CAPACITY, null); } //this调用 public PriorityQueue(int initialCapacity, Comparator<? super E> comparator) { // Note: This restriction of at least one is not actually needed, // but continues for 1.5 compatibility if (initialCapacity < 1) throw new IllegalArgumentException(); this.queue = new Object[initialCapacity]; this.comparator = comparator; }

插入元素的底层调用

注意offer调用,siftUp调用,siftUpComparable调用

q1.offer(10); // public boolean offer(E e) { if (e == null) throw new NullPointerException(); modCount++; int i = size; if (i >= queue.length) grow(i + 1); siftUp(i, e); size = i + 1; return true; } // siftUp的底层调用 private void siftUp(int k, E x) { if (comparator != null) siftUpUsingComparator(k, x, queue, comparator); else siftUpComparable(k, x, queue); } // siftUpComparable的底层调用 private static <T> void siftUpComparable(int k, T x, Object[] es) { //强转至<>中的类型 Comparable<? super T> key = (Comparable<? super T>) x; while (k > 0) { int parent = (k - 1) >>> 1; Object e = es[parent]; if (key.compareTo((T) e) >= 0) break; es[k] = e; k = parent; } es[k] = key; }

注意:默认情况下,PriorityQueue队列是⼩堆,如果需要⼤堆需要⽤⼾提供⽐较器

// ⽤⼾⾃⼰定义的⽐较器:直接实现Comparator接⼝,然后重写该接⼝中的 compare⽅法即可 // class IntCmp implements Comparator<Integer>{ @Override public int compare(Integer o1, Integer o2) { return o2-o1; } } public class TestPriorityQueue { public static void main(String[] args) { PriorityQueue<Integer> p = new PriorityQueue<>(new IntCmp()); p.offer(4); p.offer(3); p.offer(2); p.offer(1); p.offer(5); System.out.println(p.peek()); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/26 23:33:36

深度学习中的Affine与Softmax层实现与优化

1. 项目概述 在深度学习领域&#xff0c;误差反向传播算法&#xff08;Backpropagation&#xff09;是神经网络训练的核心机制。今天我们要重点讨论的是神经网络中两个关键计算层——Affine层和Softmax层的实现细节。这两个层在分类任务中扮演着至关重要的角色&#xff0c;Affi…

作者头像 李华
网站建设 2026/7/26 23:31:25

Google Cloud推提示词即代码 大模型提示词终于能版本管理了

做 AI agent 开发的人应该都有这个体验&#xff1a;系统提示词写在一个巨大的文本块里&#xff0c;改一次提心吊胆一次。一个生产环境的 agent&#xff0c;提示词动辄几百行。里面塞了角色设定、工具描述、输出格式约束、few-shot 示例、安全限制、异常处理……但凡多一个工具或…

作者头像 李华
网站建设 2026/7/26 23:26:15

C语言文件操作全指南:文件读写、随机访问与缓冲区机制

#c语言 「 每日一句 Daily Quote 」 “伟大的成就&#xff0c;唯一的方法就是热爱你所做的事。” — 史蒂夫乔布斯 文章目录前言一、为什么使用文件&#xff1f;二、什么是文件&#xff1f;2.1. 程序文件2.2. 数据文件2.3. 文件名三、二进制文件和文本文件四、文件的打开和关…

作者头像 李华
网站建设 2026/7/26 23:22:25

2026年AI论文生成工具实测:哪一款真正适合毕业生?

毕业季的夜晚总是特别长。师兄对着空白文档一小时憋出两百字开题报告&#xff1b;同寝姑娘查重率48%&#xff0c;导师批注「三天内改完」。每年这时&#xff0c;「AI论文生成」的搜索量就暴涨——但生成的东西真能过学校那一关吗&#xff1f;一句话答案&#xff1a;AI论文生成工…

作者头像 李华
网站建设 2026/7/26 23:18:04

PGP端到端加密实战:从原理到Git/邮件应用全解析

1. 项目概述&#xff1a;为什么PGP在今天依然至关重要&#xff1f;如果你经常在GitHub上提交代码&#xff0c;或者通过邮件发送一些敏感的商业文档&#xff0c;有没有想过一个问题&#xff1a;你的代码签名、你的邮件内容&#xff0c;在传输过程中真的安全吗&#xff1f;你可能…

作者头像 李华
网站建设 2026/7/26 23:16:27

TVA:具身智能通用视觉操作系统 (7)

前沿技术探索&#xff1a;AI智能体视觉&#xff08;TVA&#xff0c;Transformer-based Vision Agent&#xff09;是依托Transformer架构与“因式智能体”理论所构建的颠覆性工业视觉技术&#xff0c;是集深度强化学习&#xff08;DRL&#xff09;、卷积神经网络&#xff08;CNN…

作者头像 李华