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

相关推荐

  • 【JavaScript】深拷贝详解

    文章目录 一、什么是深拷贝? 1. 浅拷贝与深拷贝的区别 示例: 2. 深拷贝的必要性 二、深拷贝的常见方法 1. JSON 方法 使用示例: 优点: 局限性: 2. 递归实现深拷贝 实现示例: 优点: 局限性: 3. 使用 Lodash 的 cloneDeep 方法 使用示例: 优点: 局限性: 4. 使用结构化克隆算法 使用示例: 优点: 局限性: 三、…

    未分类 2025 年 5 月 12 日
    30200
  • JavaScript 延迟加载的方法( 7种 )

    JavaScript脚本的延迟加载(也称为懒加载)是指在网页的主要内容已经加载并显示给用户之后,再加载或执行额外的JavaScript代码。这样做可以加快页面的初始加载速度,改善用户体验,并减少服务器的压力。 以下是几种常见的延迟加载JavaScript的方法: defer 属性: 使用 async 属性: async 属性告诉浏览器立即开始下载脚本,并且在…

    2025 年 1 月 19 日
    46500
  • Python 调整Excel行高、列宽

    在Excel中,默认的行高和列宽可能不足以完全显示某些单元格中的内容,特别是当内容较长时。通过调整行高和列宽,可以确保所有数据都能完整显示,避免内容被截断。合理的行高和列宽可以使表格看起来更加整洁和专业,尤其是在包含大量数据的情况下。 本文将介绍如何通过Python调整Excel的行高列宽、或设置自适应行高列宽 。 Python Excel库 要通过Pyth…

    2024 年 12 月 24 日
    40500
  • 手动部署前后端分离的项目到本地

    1.准备工作 使用maven打包springboot项目为.jar文件得到springboot-0.0.1-SNAPSHOT.jar 打包vue项目 npm install -g @vue/cli安装Vue CLI 在项目根目录下,运行npm run build命令来构建项目得到一个dist文件夹 将打包好的文件通过远程仓库中转至docker虚拟机 在虚拟机…

    2025 年 1 月 12 日
    71600
  • Java中的Map(如果想知道Java中有关Map的知识点,那么只看这一篇就足够了!)

    前言:在Java编程领域,集合框架(Collection Framework)扮演着至关重要的角色,它提供了丰富的接口和类,用于管理和操作数据集合。在这些接口和类中,Map和Set因其独特的功能而备受青睐,Map用于存储键值对,而Set则用于存储不允许重复的元素集合。 ✨✨✨ 这里是秋刀鱼不做梦的BLOG 目录 1.Map概念简介 (1)Map的定义 (2)…

    2024 年 12 月 27 日
    52300

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信