二叉堆(Binary Heap)

看动画学算法之:二叉堆Binary Heap 我们坐在高高的谷堆旁边,听妈妈讲那过去的事情。听到了堆,我就想起了这首歌。 没错,今天我们要介绍一个堆,这个堆叫做二叉堆。 二叉树我们之前讲过了,就是每个节点最多有两个子节点的树叫做二叉树。而二叉堆Binary Heap是一种特殊的二叉树。 阅读详情

堆是完全二叉树,我们使用下标从1开始的数组来表示这颗树,1代表根节点,对于每个节点 i i i,它的左孩子为 i × 2 i \times 2 i×2,右孩子为 i × 2 + 1 i\times 2 + 1 i×2+1,父亲节点为 i / 2 i/2 i/2。最大堆和最小堆是二叉堆的形式,按照最大元素位于根节点排列的二叉堆被称为最大堆,同理按照最小元素位于根节点排列的二叉堆被称为最小堆。

二叉堆中主要的操作有查询、删除、插入,对于破坏堆性质的节点,可以使用上浮和下沉操作进行调整。

下面的操作以最大堆为例。

上浮

不断与父节点比较,如果比父节点大就与之交换,直到不大于父节点或成为根节点为止。

void up(int p) {
    for (int i = p; i > 1 && heap[i] > heap[i / 2]; i = i / 2) {
        swap(i, i / 2);
    }
}

void swap(int p1, int p2) {
    heap[p1] += heap[p2];
    heap[p2] = heap[p1] - heap[p2];
    heap[p1] = heap[p1] - heap[p2];
}

下沉

不断与较大的子节点比较,如果比它小就与之交换,直到不小于任何子节点或成为叶子节点为止。

void down(int p) {
    for (int i = p, j = son(i); j < heap.length && heap[j] > heap[i]; i = j, j = son(i)) {
        swap(i, j);
    }
}

int son(int p) {
    return 2 * p + ((2 * p + 1 <= heap.length && heap[2 * p + 1] > heap[p]) ? 1 : 0);
}

插入

直接在数组尾部插入值,然后上浮即可。

void push(int v) {
    heap[++size] = v;
    up(size);
}

删除

可以将根节点与最后一个节点交换,使size减1,然后根节点下沉。

void pop() {
    swap(1, size--);
    down(1);
}

查询

直接返回根节点即可。

int top() {
    return heap[1];
}

代码

完整的代码为:

public class Template {

    int size;
    int[] heap;

    public Template(int _size) {
        heap = new int[_size + 1];
        size = 0;
    }

    void up(int p) {
        for (int i = p; i > 1 && heap[i] > heap[i / 2]; i = i / 2) {
            swap(i, i / 2);
        }
    }

    void swap(int p1, int p2) {
        heap[p1] += heap[p2];
        heap[p2] = heap[p1] - heap[p2];
        heap[p1] = heap[p1] - heap[p2];
    }

    void down(int p) {
        for (int i = p, j = son(i); j < size && heap[j] > heap[i]; i = j, j = son(i)) {
            swap(i, j);
        }
    }

    int son(int p) {
        return 2 * p + ((2 * p + 1 <= size && heap[2 * p + 1] > heap[p]) ? 1 : 0);
    }

    void push(int v) {
        if (size >= heap.length - 1) return;
        heap[++size] = v;
        up(size);
    }

    void pop() {
        if (size > 0) return;
        swap(1, size--);
        down(1);
    }

    int top() {
        return heap[1];
    }

    public static void main(String[] args) {
        Template template = new Template(2);
        template.push(2);
        template.push(5);
        template.pop();
        template.pop();
    }
}

参考文献:

  1. 算法学习笔记(47): 二叉堆
几种堆(BinaryHeap, FibHeap, PairHeap)在Dijkstra算法上的效率试 立即下载

相关推荐

SqlSugar避坑指南:C#操作MySQL时你可能会忽略的5个细节

本文分享了使用C#和SqlSugar框架操作MySQL数据库时的实战避坑指南。针对连接配置、实体映射、查询性能、事务处理等关键环节,深入剖析了5个容易被忽略但至关重要的细节,帮助开发者提升项目稳定性和执行效率,避免常见陷阱。

delta的博客 276

二叉堆 Binary Heap

二叉堆 Binary HeapBinary Heap的基本概念Binary Heap的核心原理siftUpsiftDownBinary Heap的基本方法HeapifyPushPopBinary Heap的时间复杂度Binary Heap的实现Heap InterfaceHeap AbstractMax HeapMin Heap Binary Heap的基本概念 Heap是一个完全二叉树 (Complete Tree) 根节点最大是Max Heap, 根节点最小是Min Heap Max Hea

HelloWorld 1243

基于Vivado2025的UltraScale+时序收敛优化实战案例

深入解析在Vivado2025环境中针对UltraScale+架构的时序收敛挑战,结合实际设计案例,分享关键优化策略与操作技巧,显著提升设计性能与收敛效率。vivado2025的更新特性为时序优化带来新机遇。

weixin_33660045的博客 343

【数据结构与算法学习笔记-Binary Heap优先队列和二叉堆】

本文为学习笔记,感兴趣的读者可在MOOC中搜索《数据结构与算法Python版》或阅读《数据结构(C语言版)》(严蔚敏)。 本文包括优先队列的介绍,从树到完全二叉树到二叉堆的关系,二叉堆的实现(Python和JavaScript),相关复杂度的计算。

floating_heart的博客 746

【ArcGIS Pro微课1000例】0023:ArcGIS Pro 3.0中打开GeoPackage数据库(.gpkg)

本文讲解ArcGIS Pro 3.0中打开GeoPackage数据库(.gpkg)的两种方法。

智慧空间实验室 4639

拆开它的“身体”,看懂割草机器人的五层系统架构

这篇文章深入解析了智能割草机器人的五层系统架构。机械层采用铝合金一体式车架和独立悬挂刀盘系统;电子层配备双处理器和多种传感器;固件层实现毫秒级安全响应;算法层融合多种定位技术实现厘米级精度;云服务层提供远程管理和AI优化。这套系统通过精密协同实现了智能割草的全流程闭环,展现了从机械结构到云端智能的完整技术栈,为户外智能设备设立了新的技术标杆。

智能硬件研发,欢迎交流 197

[数据结构与算法]-二叉堆(binary heap)介绍及其实现(Java)

本文欢迎转载,转载前请联系作者。若未经允许转载,转载时请注明出处,谢谢! http://blog.youkuaiyun.com/colton_null 作者:喝酒不骑马 Colton_Null from 优快云 一.什么是二叉堆? 二叉堆(binary heap)是一种通常用于实现优先队列的数据结构。要想知道二叉堆是什么东西,得从两方面介绍它:结构性和堆序性。 1.结构性 二叉堆是一颗除底层...

因特马 4644

手把手教你完成YOLOv9 PyQt5目标检测界面搭建,实现图片检测、视频检测、摄像头检测,可用于大论文凑工作量或毕设必备,全网最详细教程

目标检测是计算机视觉中的重要任务,广泛应用于安防监控、自动驾驶、智能家居等领域。YOLO系列模型由于其高效的检测速度和较高的准确率,成为目标检测任务的首选算法之一。本项目结合 YOLOv9与 PyQt5,构建了一个图形化界面,便于用户进行目标检测的操作和展示,实现对图片、视频和摄像头的实时目标检测,不仅可以用于大论文的工作量展示,还可以作为毕业设计。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2657

STL源码剖析笔记——Binary Heap、priority_queue

STL源码剖析笔记——Binary Heap、priority_queue

weixin_48956191的博客 1449

Python面试题及详细答案150道(126-135) -- 数据库交互篇

本文介绍了Python中操作MySQL、SQLite数据库及ORM框架的核心技术。主要内容包括:1. 使用pymysql连接MySQL数据库,演示了连接配置、SQL执行和事务管理;2. ORM原理及主流框架SQLAlchemy和Django ORM的示例;3. 通过sqlite3模块操作轻量级SQLite数据库;4. 数据库事务的ACID特性解析。这些内容涵盖了Python数据库开发的关键知识点,适合准备前后端面试的开发者复习核心概念和实际应用。

大剑师兰特的GIS世界 1727

【八股】JUC并发编程篇

👉抽象队列同步器,就是一种锁,内部维护的是一个先进先出的双向队列,队列中存储的是排队的线程,用state来标识是否有线程获得锁【0是无锁状态】👉流程:当一个线程拿到锁后会修改state = 1,这时如果有其他线程访问则会进入队列进行排序,直到state变成0后,队头线程才会拿到锁。在对state进行修改时,用的是CAS操作,所以可以保证原子性。👉它可以实现公平锁或非公平锁【默认】,上述是一个公平锁。如果新线程和队头线程抢锁资源就是非公平锁。

qq_44768318的博客 551

Binary Heap(二叉堆)

Binary Heap(二叉堆) 在计算机科学中,二叉堆是二叉树形状的堆结构。二叉堆是最常见的实现优先级队列的方法,它与优先级队列紧密相连,一起应用到诸多地方,在很多主流语言的标准算法库中都能看到它们的身影。同时它也是很多算法中需要用到的底层数据结构,能够快速地掌握这些已有的标准库和类,能够很高效地实现诸多算法。

chouisbo的博客 1879

4、风险管理、信息安全与信息管理的核心原则

本文深入探讨了风险管理、信息安全与信息管理的核心原则,涵盖Risk IT框架、ISO 31000标准以及信息安全与信息管理的关键原则。通过案例分析与实际应用挑战的解析,帮助组织更好地应对数字化时代的风险与安全问题,实现可持续发展。

bread的博客 120

二叉堆(Binary Heap)

Binary Heap: 一个二叉堆(Binary Heap)是具有下面一些属性的二叉树: 1)是一个完全二叉树,即:除了叶子节点以外的其他节点全部有左右子树,并且最后一层的叶子节点按照从左到右填充。 2) 一个二叉堆可以是最大堆或者最小堆。 在最大堆中,根节点的值最大; 在最小堆中,根节点的值最小; 3) 所有子树符合性质2)最小二叉堆实例 10

hit_ynsun的博客 1118

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

二叉堆(binary heap)

前言 计算机两大基础:算法,数据机构。说到数据结构 ,必然就要提到堆栈。下面就来看看堆是个什么玩意儿。 二叉堆 二叉堆就是二叉树(又叫优先队列priority-queue),完全的二叉树中每一个父节点下有两个子节点。今天我们以max_heap为例,就是传说中的最大堆,即每一个父节点都要比自己的两个子节点大,根节点最大,它大于整个二叉堆中的所有节点值。 我们用一个vector来表示二叉堆...

qq_39747794的博客 643

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Python实现二叉堆-Binary Heap

本篇文章将简要解释什么是二叉堆以及二叉堆的Python实现什么是二叉堆(binary heap)实现思路(以最大堆为例)通过上浮操作来向堆中新增元素通过下沉操作来取出堆中元素数据结构设计&封装实现 什么是二叉堆(binary heap) 二叉堆是一种满足特殊性质的二叉树。具有以下性质: 二叉堆是一颗完全二叉树(除叶子节点以外其余节点的左右孩子都不为空) 所有节点的值都大于等于(最大堆)孩...

baidu_36146918的博客 1348

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

二叉堆(Binary_Heap)

二叉堆满足其结构性,和堆序性。结构性:要求为完全二叉树,即除树的最底层外,树被完全填满,且底层的元素从左向右填充。堆序性:即在堆中要求,对任意元素X,X的父节点的关键字小等于X的关键字,如此得到最小堆。同理可得最大堆。 由于堆序性,因此二叉堆也常称为实现优先队列(Priority Queue)。 在对二叉堆进行操作时需要始终保持其结构性和堆序性。可用数组来实现二叉堆。数组中的元素关系为:i位置上的节点,其左儿子在2i上,右节点在2i+1上,父节点在i/2(取整)上。用数组代替树结构,从而不用包含指针操作

艰难困苦如同欢乐,终将成为人生最后的财富 1022

Binary Heap 二叉堆 (二)

二叉堆

分享我的点点滴滴,在成长路上与你同行! 664

【学习笔记】堆Heap和 二叉堆 Binary Heap

1.堆 Heap 定义:可以迅速找到一堆数中的最大值或者最小值的数据结构。 应用场景:经常是一个数一个数的过来,比如找最大值或者找最小值 分类:堆本身是一个抽象的数据结构,根据实现形式,将其分为二叉堆、斐波那契堆等。 P.S: 二叉堆是堆(优先队列 priority_queue) 的一种常见且简单的实现,但是并不是最优的实现形式,但是在面试的时候以及教科书上出现比较多。真正在工程中使用的是 严格斐波那契堆等性能优异的堆,面试的时候知道有这么一种堆就行,暂时没必要知道怎么实现的。 参考 将根节点最大的堆叫做

KaelCui的博客 449

二叉堆(Binary heap)

Binary heap There are several types of heaps, but in the current article we are going to discuss the binary heap. For short, let's call it just "heap". It is used to implement priority queue ADT 

bdss58的专栏 2686

数据结构之Binary Heap(二叉堆)

数据结构之Binary Heap(二叉堆)1.Binary Heap的定义 二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全二元树(二叉树)。二叉堆有两种:最大堆和最小堆。最大堆:父结点的键值总是大于或等于任何一个子节点的键值;最小堆:父结点的键值总是小于或等于任何一个子节点的键值。二叉堆一般用数组来表示。

Rosun 6621

二叉堆-Binary heap

基本思想 (二叉)堆的定义 n个关键字序列k1,k2,…,kn称为堆,当且仅当该序列满足如下性质之一(简称堆性质):ki≤k2i且ki≤k2i+1 或 ki≥k2i且ki≥k2i+1(1≤i≤FLOOR(n/2)) 若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若 存在)结点的关键字

BrokenIceCrystal的博客 1344
上一篇: 单调栈(Monotonic Stack)
下一篇: 二叉搜索树(Binary Search Tree)
小菜2小白
博客等级 码龄4年 4粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值