当前位置: 首页 > ai >正文

Java中的大根堆与小根堆

文章目录

  • Java中的大根堆与小根堆
    • 📌 什么是堆?
    • 🛠 Java 中的 PriorityQueue
      • 1. 小根堆(默认)
      • 2. 大根堆(通过自定义 Comparator)
    • 存放自定义对象
    • 常用方法
    • 注意事项

Java中的大根堆与小根堆

在实际开发中,我们经常会遇到需要频繁取出最大值或最小值的场景,例如滑动窗口最大值、合并多个有序数组、求 Top K 元素等。Java 提供了一个非常实用的数据结构 PriorityQueue,它本质上是一个堆(Heap),默认是小根堆,通过自定义比较器也可以实现大根堆

本文将介绍如何在 Java 中使用 PriorityQueue 构建小根堆和大根堆,并结合典型应用场景加以说明。

📌 什么是堆?

堆是一种特殊的完全二叉树,满足以下性质:

  • 小根堆(最小堆):每个节点的值 ≤ 子节点的值。堆顶是最小元素。
  • 大根堆(最大堆):每个节点的值 ≥ 子节点的值。堆顶是最大元素。

🛠 Java 中的 PriorityQueue

1. 小根堆(默认)

Java 的 PriorityQueue 默认实现的是 小根堆

import java.util.PriorityQueue;PriorityQueue<Integer> minHeap = new PriorityQueue<>();minHeap.offer(5);
minHeap.offer(2);
minHeap.offer(8);System.out.println(minHeap.peek()); // 输出 2

peek() 返回堆顶(最小值),不会移除元素
poll() 返回并移除堆顶

2. 大根堆(通过自定义 Comparator)

要构建大根堆,需要传入一个自定义比较器

PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);maxHeap.offer(5);
maxHeap.offer(2);
maxHeap.offer(8);System.out.println(maxHeap.peek()); // 输出 8

或者使用 Comparator.reverseOrder() 简化写法:

PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Comparator.reverseOrder());

存放自定义对象

当我们希望按照某个字段排序时,可以将对象封装成一个类,并自定义排序逻辑:

class Pair {int value;int index;public Pair(int value, int index) {this.value = value;this.index = index;}
}// 按 value 降序排序(大根堆)
PriorityQueue<Pair> pq = new PriorityQueue<>((a, b) -> b.value - a.value);pq.offer(new Pair(10, 1));
pq.offer(new Pair(5, 2));System.out.println(pq.peek().value); // 输出 10

常用方法

方法描述
offer(E e)添加元素
poll()移除并返回堆顶元素
peek()查看堆顶元素(不移除)
size()获取元素个数
isEmpty()判断是否为空

注意事项

PriorityQueue 不允许存放 null 元素

默认不是线程安全的,如需线程安全可使用 PriorityBlockingQueue

PriorityQueue 不是普通 FIFO 队列,出队顺序由优先级决定

http://www.xdnf.cn/news/8146.html

相关文章:

  • 无人机避障——深蓝学院浙大Ego-Planner规划部分
  • 工具看点 | 澳鹏多模态标注工具:构建AI认知的语义桥梁
  • 第四十五节:目标检测与跟踪-Meanshift/Camshift 算法
  • MCP Server Resource 开发学习文档
  • 记一次奇葩的错误,uniapp @tap点击失效
  • Nockchain项目部署教程
  • 从连接中枢到终端接入——解析工业无线AP与客户端的协同之道
  • 安装部署配置jenkins
  • Nginx 1.25.4交叉编译问题:编译器路径与aclocal.m4错误解决方案
  • wifi 如果检查失败,UI 就会出现延迟或缺失打勾的现象。
  • linux中部署jdk,开机自启动jdk以及linux中java开机自启某个jar包文件
  • 算法第26天 | 贪心算法、455.分发饼干、376. 摆动序列、 53. 最大子序和
  • 如何在Java中进行PDF合并
  • 软考 系统架构设计师系列知识点之杂项集萃(69)
  • Linux Shell编程(五)
  • 【鸿蒙开发】Hi3861学习笔记-超声波测距
  • HTB-Titanic
  • 多模态大语言模型arxiv论文略读(八十八)
  • LeetCode面试经典150题梳理
  • java I/O
  • 【补题】The 2021 ICPC Asia Nanjing Regional Contest Problem J. Xingqiu’s Joke
  • [Java][Leetcode middle] 6. Z 字形变换
  • TCP与UDP协议全面对比:从原理到应用场景深度解析
  • ROS2 camera_calibration 双目相机标定指令
  • 监控易一体化运维:网络拓扑管理,网络管理高效之道
  • 异常数据的检测
  • 【基础】Windows开发设置入门11:hyper-v虚拟机创建
  • 批处理操作优化思路
  • 使用Pyinstaller打包python,全过程解析【2025最详细】
  • 湖北理元理律师事务所:专业债务优化如何助力负债者重获生活掌控权