【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 日

相关推荐

  • manim边学边做–改变动画速度

    ChangeSpeed类是Manim库中用于修改动画速度的类。 它提供了一种灵活的方式来控制动画的播放速度,使动画在不同时间段内以不同的速度播放,从而创造出更加丰富多样的动画效果。 比如,在创建包含多个元素动画的场景中,通过ChangeSpeed可以精确控制不同元素在不同时间点的移动速度,实现复杂的动画节奏编排。 1. 动画概述 与之前介绍的那些动画类不同,…

    2025 年 1 月 6 日
    28400
  • 2025 年最好的谷歌地图数据采集软件推荐

    2024 年,谷歌地图抓取已成为企业和研究人员的一大变革。凭借不断更新的餐厅、酒店、药店等数据库,谷歌地图提供了大量信息。通过使用正确的谷歌地图抓取工具,您可以解锁有价值的见解,以进行潜在客户生成、市场研究和竞争分析。最好的谷歌地图抓取工具使您能够自动收集数据,节省时间和资源,同时确保准确性。无论您是想分析竞争对手还是扩大客户群,这些工具都能为您提供成功所需…

    未分类 2025 年 1 月 6 日
    45900
  • Java:IO流详解

    文章目录 基础流 1、IO概述 1.1 什么是IO 1.2 IO的分类 1.3 顶级父类们 2、字节流 2.1 一切皆为字节 2.2 字节输出流 OutputStream 2.3 FileOutputStream类 2.3.1 构造方法 2.3.2 写出字节数据 2.3.3 数据追加续写 2.3.4 写出换行 2.4 字节输入流 InputStream 2.…

    未分类 2025 年 5 月 13 日
    20200
  • 架构师启示录:知识模型、落地方法与思维模式PDF、EPUB免费下载

    适读人群 :资深程序员、初级架构师 从架构知识模型、架构落地方法、架构思维模式三大维度介绍架构师的能力模型,带你穿越“认知迷雾” 电子版仅供预览,下载后24小时内务必删除,支持正版,喜欢的请购买正版书籍 点击原文去下载 书籍信息 作者: 灵犀出版社: 机械工业出版社出版年: 2024-3页数: 212装帧: 平装丛书: 架构师书库ISBN: 97871117…

    2025 年 1 月 12 日
    44700
  • 扣子又出新功能,支持一键部署小程序,太强了!!

    大家好,我是R哥。 作为一名程序员和技术博主,我一直关注如何使用工具提升生产力,尤其是在内容创作和应用开发领域。 拿我开发一个微信小程序为例,我需要懂前端、后端、运维 等全栈技术,开发流程和技术栈复杂,我还需要购买云服务器、云数据库 等各种基础设施,资源耗费非常多。 虽然现在有如 Cursor 这样的革命性 AI 开发工具,它突破了传统开发模式的壁垒,非开发…

    2025 年 1 月 10 日
    68100

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信