【Java】还在死磕算法?懂“堆”与“优先级队列”,代码效率飙升

dc49951ad219454bbef81e408b809a6b.gif

欢迎 💛点赞 🌟收藏 💫关注


🏆堆

一、🎯堆的定义

堆的概念

堆是一种特殊的完全二叉树,它通过一维数组顺序存储关键码集合K={k0,k1,k2,...,kn-1},并遵循特定的顺序关系来定义。具体来说,若对于任意节点Ki,都满足Ki <= K2i+1 且 Ki <= K2i+2(或Ki >= K2i+2),则称这样的堆为小堆。堆分为两种类型:大根堆小根堆

  • 小根堆:根节点的值最小,父节点的值小于或等于其子节点的值;
  • 大根堆:根节点的值最大,父节点的值大于或等于其子节点的值;

c97ff782617443feb96aeb1f70a5c13e.png

堆的性质

  • 堆是一个完全二叉树;
  • 堆中任意节点的值总是不大于(或不小于)其父节点的值;

二、🀄️堆的构建

大堆

构建过程:
255b7fc12bd94eed89801a9e8ceccba9.png

ec55d38b93bd4e43a40ff20226edf8c7.png

代码实现:

public class Heap {
    public int[] elem; // 存储元素的数组
    public int usedSize; // 已使用的数组大小

    public Heap() {
        this.elem = new int[10];
    }

    // 初始化堆
    public void initHeap(int[] elem) {
        for (int i = 0; i < elem.length; i++) {
            this.elem[i] = elem[i];
            usedSize++;
        }
    }

    // 构建大堆,通过将父节点向下调整实现
    public void creatHeap() {
        for (int parent = (usedSize - 1) / 2; parent >= 0; parent--) {
            siftDown(parent, usedSize);
        }
    }

    public void siftDown(int parent, int usedSize) {
        int child = 2 * parent + 1;
        while (child < usedSize) {
            if (child + 1 < usedSize && elem[child] < elem[child + 1]) {
                child++;
            }
            if (elem[child] > elem[parent]) {
                swap(elem, child, parent);
                parent = child;
                child = 2 * parent + 1;
            } else {
                break;
            }
        }
    }

    private void swap(int[] elem, int i, int j) {
        int tmp = elem[i];
        elem[i] = elem[j];
        elem[j] = tmp;
    }
}

小堆

小堆的构建思路与大堆相似,区别在于父节点的值需要小于子节点的值。

代码实现:
```java
private void swap(int[] elem, int i, int j) {
int tmp = elem[i];
elem[i] = elem[j];
elem[j] = tmp;
}

public void creatHeap2() {
for (int parent = (usedSize - 1) / 2; parent >= 0; parent--) {
siftDown2(parent, usedSize);
}
}

public void siftDown2(int parent, int usedSize) {
int child = 2 * parent + 1;
while (child < usedSize) {
if (child + 1 < usedSize && elem[child] > elem[child + 1]) {
child++;

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/4516.html

(0)
LomuLomu
上一篇 2024 年 12 月 27 日
下一篇 2024 年 12 月 27 日

相关推荐

  • (2025自测有效!)全网最好的python配置教程【非常非常适合小白】

    前几天我的电脑刚刚重装,把python重新配置了一下。 1.Python环境部署Python3 可应用于多平台包括 Windows、Linux 和 Mac OS X。 Python官网:https://www.python.org/ 进入官网在导航栏选择Dowmloads,选择所使用的系统(以Windows为例) 进入Windows下载页之后选择需要下载的版…

    2025 年 1 月 10 日
    58100
  • 【IDEA永久激活】IntelliJ IDEA 2024破解教程及永久激活码

    IntelliJ IDEA 是广受欢迎的顶级 Java 集成开发环境之一。本教程将介绍如何使用脚本免费激活 IntelliJ IDEA,包括 2021 年及以后的版本。 一、安装 IntelliJ IDEA 请访问 JetBrains 官方网站,下载 IntelliJ IDEA 的最新版本,并按照指示完成安装。 二、激活工具下载 Windows 用户:请注意…

    未分类 2024 年 7 月 9 日
    2.5K00
  • 华为OD机试E卷 –英文输入法–24年OD统一考试(Java & JS & Python & C & C++)

    文章目录 题目描述 输入描述 输出描述 用例 JS算法源码 Java算法源码 python算法源码 c算法源码 c++算法源码 题目描述 主管期望你来实现英文输入法单词联想功能。需求如下:• 依据用户输入的单词前缀,从已输入的英文语句中联想出用户想输入的单词,按字典序输出联想到的单词序列,• 如果联想不到,请输出用户输入的单词前缀。 注意: 英文单词联想时,…

    未分类 2025 年 1 月 15 日
    62500
  • Java核心设计模式解析与典型应用场景剖析

    Java设计模式深度解析与实践应用 在构建高质量软件系统时,设计模式作为经验结晶能够有效解决特定场景下的架构难题。合理运用这些模式可以显著提升代码质量,增强系统的灵活性和可维护性。以下将深入分析几种典型的Java设计模式,并配以实例代码说明其应用场景。 1. 单实例模式(Singleton) 核心概念:保证类在程序运行期间仅有一个实例存在,并提供统一的访问入…

    未分类 2025 年 5 月 13 日
    37700
  • 【潜意识Java】Java匿名内部类深入笔记总结,助力开启高效编程新征程。

    目录 一、匿名内部类是什么 (一)概念引入 (二)语法结构 二、匿名内部类的优势 (一)简洁的代码表达 (二)灵活的功能实现 三、匿名内部类在实际场景中的应用 (一)图形绘制系统 (二)事件驱动编程 四、匿名内部类与局部内部类、成员内部类的比较 (一)与局部内部类的区别 (二)与成员内部类的区别 五、匿名内部类的注意事项 (一)访问外部变量的限制 (二)调试…

    2025 年 1 月 19 日
    63700

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信