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

二叉堆的原理性质和应用

二叉堆的原理性质和应用二叉堆的主要操作就两个sink下沉和swim上浮用以维护二叉堆的性质。二叉堆的主要应用有两个首先是一种很有用的数据结构优先级队列二是堆排序。二叉堆的原理二叉堆就是一种能够动态排序的数据结构。所谓动态排序就是说我们可以不断往数据结构里面添加或删除元素数据结构会自动调整元素的位置使得我们可以有序地从数据结构中读取元素这是一般的排序算法做不到的。能动态排序的常用数据结构其实只有两个一个是优先级队列底层用二叉堆实现另一个是二叉搜索树。二叉搜索树的用途更广泛优先级队列能做的事情二叉搜索树其实都能做。但优先级队列的接口和代码实现相较于二叉搜索树更简单所以一般能用优先级队列解决的问题没必要用二叉搜索树。二叉堆是怎么做到动态排序的呢这就要说到二叉堆这种结构的性质了。二叉堆的性质二叉堆是一种特殊的二叉树这棵二叉树上的任意节点的值都必须大于等于或小于等于其左右子树所有节点的值。如果是大于等于我们称之为大顶堆如果是小于等于我们称之为小顶堆。对于小顶堆每个节点下方的所有节点的值都比它大那么根节点就是整棵树上的最小值。同理大顶堆的根节点就是整棵树上的最大值。所以二叉堆可以辅助我们快速找到最大值或最小值。二叉堆还有个性质一个二叉堆的左右子堆子树也是一个二叉堆。二叉堆的应用优先级队列常见接口插入元素pq.push(int x)删除堆顶pq.pop()返回堆顶元素pq.top()判空pq.empty()元素个数pq.size()大顶堆和小顶堆的写法默认为大顶堆小顶堆写法priority_queueint, vectorint, greaterint qp;在题目中的应用力扣23 合并k个升序链表给你一个链表数组每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中返回合并后的链表。思路合并k个有序链表的逻辑类似合并两个有序链表难点在于如何快速得到k个节点中的最小节点接到结果链表上我们就要用到优先级队列这种数据结构把链表节点放入一个最小堆就可以每次获得k个节点中的最小节点。代码class Solution { public: ListNode* mergeKLists(vectorListNode* lists) { if (lists.empty()) return nullptr; // 虚拟头结点 ListNode* dummy new ListNode(-1); ListNode* p dummy; // 优先级队列最小堆 auto cmp [](ListNode* a, ListNode* b) { return a-val b-val; }; priority_queueListNode*, vectorListNode*, decltype(cmp) pq(cmp); // 将 k 个链表的头结点加入最小堆 for (ListNode* head : lists) { if (head ! nullptr) { pq.push(head); } } while (!pq.empty()) { // 获取最小节点接到结果链表中 ListNode* node pq.top(); pq.pop(); p-next node; if (node-next ! nullptr) { pq.push(node-next); } // p 指针不断前进 p p-next; } return dummy-next; } };由于这里装的是listNode*所以必须自定义比较器cmp以使用小顶堆。堆排序每次传入一个无序数组需要重新开始建堆heapify函数就是从堆顶向下逐个比较然后一致维护堆的性质。voidswap(int*a,int*b){inttemp*a;*a*b;*btemp;}voidheapify(intarr[],intn,inti){//这里i指目前的堆顶intlargesti;intlsoni*21;intrsoni*22;if(lsonnarr[largest]arr[lson])largestlson;if(rsonnarr[rson]arr[largest])largestrson;if(largest!i){swap(arr[largest],arr[i]);heapify(arr,n,largest);}}voidheap_sort(intarr[],intn){inti;for(in/2-1;i0;i--)//建堆heapify(arr,n,i);for(intin-1;i0;i--){swap(arr[i],arr[0]);heapify(arr,i,0);}}二叉堆的实现二叉堆多数情况是用数组实现而非二叉树主要原因有二第一个原因是链表节点需要一个额外的指针存储相邻节点的地址所以相对数组链表的内存消耗会大一些。第二个原因也是最主要的原因是时间复杂度的问题正常情况下如何拿到二叉树的底层最右侧节点需要层序遍历或递归遍历二叉树时间复杂度是 O(N)如果用数组来模拟二叉树就可以完美解决这个问题在 O(1)时间内找到二叉树的底层最右侧节点。使用数组来模拟二叉树以及相关公式// 父节点的索引 int parent(int node) { return (node - 1) / 2; } // 左子节点的索引 int left(int node) { return node * 2 1; } // 右子节点的索引 int right(int node) { return node * 2 2; }

相关文章:

二叉堆的原理性质和应用

二叉堆的原理性质和应用 二叉堆的主要操作就两个,sink(下沉)和 swim(上浮),用以维护二叉堆的性质。 二叉堆的主要应用有两个,首先是一种很有用的数据结构优先级队列,二是堆排序。 二…...

零代码部署MedGemma:小白也能快速上手的医学AI分析工具

零代码部署MedGemma:小白也能快速上手的医学AI分析工具 1. 项目简介:你的私人医学影像“翻译官” 想象一下,你手头有一张X光片或CT影像,想快速了解它的关键信息,但又没有医学背景。或者,你是一名医学生&a…...

突破苹果限制:OpenCore-Legacy-Patcher让老旧Mac重获新生

突破苹果限制:OpenCore-Legacy-Patcher让老旧Mac重获新生 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore-Legacy-Patcher(简称OCLP&#…...

网络模型的简单认识

作为学习者,我仅将所学知识进行系统梳理和总结。如有任何疏漏或错误,敬请指正。OSI模型与TCP/IP模型对比OSI模型7层结构 应用层、表示层、会话层、传输层、网络层、数据链路层、物理层TCP/IP模型4层结构 应用层、传输层、网络层、网络接口层层级对应关系…...

GLM-4.7-Flash与ChatGPT对比评测:性能与应用场景分析

GLM-4.7-Flash与ChatGPT对比评测:性能与应用场景分析 1. 引言 最近AI圈又迎来了一位新选手——GLM-4.7-Flash,这款号称"30B级别最强"的模型在开源社区引起了不小轰动。作为一个长期关注AI模型发展的技术爱好者,我第一时间上手测试…...

SM30表维护实战:如何用SE54事件自动记录创建/修改日志(附完整代码)

SM30表维护实战:如何用SE54事件自动记录创建/修改日志 在SAP系统开发中,表维护功能(SM30)是日常开发中最常用的工具之一。无论是配置表还是业务数据表,我们经常需要记录数据的创建和修改信息——谁在什么时候创建或修改了这条记录&#xff1f…...

揭秘Diablo Edit:探索暗黑破坏神角色定制的无限可能

揭秘Diablo Edit:探索暗黑破坏神角色定制的无限可能 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 暗黑破坏神存档编辑工具Diablo Edit为玩家提供了超越常规游戏体验的角色定制能力。…...

AMD显卡性能释放指南:Blender渲染效率提升全攻略

AMD显卡性能释放指南:Blender渲染效率提升全攻略 【免费下载链接】ZLUDA CUDA on Intel GPUs 项目地址: https://gitcode.com/GitHub_Trending/zl/ZLUDA 问题溯源:AMD显卡的Blender性能困境 Blender作为专业的3D创作工具,其Cycles渲染…...

语音识别入门必看:梅尔频谱图 vs MFCC 到底怎么选?附对比实验数据

语音识别特征工程实战:梅尔频谱图与MFCC的深度对比与应用指南 在咖啡馆嘈杂的背景音中,你的语音助手依然能准确识别"打开导航"的指令;在千人千面的声音里,银行系统能精准验证你的声纹身份——这些AI语音技术的魔法背后&…...

Java实战:绿盾加密文件批量解密工具Ldterm的实现与优化

1. 绿盾加密文件解密工具开发背景 在企业数据安全领域,绿盾(Ldterm)是广泛使用的文件加密系统。很多开发者在进行数据迁移或备份时,都会遇到需要批量解密文件的场景。我去年接手过一个项目,客户有超过50GB的绿盾加密文…...

OpenSSL实战:AES-CBC 128位加密DLL在车载诊断系统的集成与应用

1. OpenSSL与AES-CBC加密基础 先说说为什么车载系统需要加密。去年给某车企做诊断系统升级时,他们的工程师告诉我:"现在黑客用200块的设备就能截获CAN总线数据,修改车速信号跟玩儿似的。"这让我意识到,没有加密的车载通…...

Qwen3-14B GPU算力弹性伸缩:K8s HPA基于vLLM metrics自动扩缩Pod

Qwen3-14B GPU算力弹性伸缩:K8s HPA基于vLLM metrics自动扩缩Pod 1. 模型与部署概述 1.1 Qwen3-14b_int4_awq模型简介 Qwen3-14b_int4_awq是基于Qwen3-14b模型的量化版本,采用int4精度和AWQ(Adaptive Weight Quantization)量化…...

Qwen3-14B多场景落地实践:客服话术生成、会议纪要整理、PRD初稿编写

Qwen3-14B多场景落地实践:客服话术生成、会议纪要整理、PRD初稿编写 1. 模型简介与部署 1.1 Qwen3-14B模型概述 Qwen3-14b_int4_awq是基于Qwen3-14B模型的量化版本,采用int4精度和AWQ(Activation-aware Weight Quantization)技…...

老Mac复活指南:用OpenCore Legacy Patcher实现性能提升30%的系统升级

老Mac复活指南:用OpenCore Legacy Patcher实现性能提升30%的系统升级 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 一、问题导入:老旧Mac的困境与…...

Phi-3-vision-128k-instruct自主部署:中小企业低成本构建图文AI能力

Phi-3-vision-128k-instruct自主部署:中小企业低成本构建图文AI能力 1. 模型简介 Phi-3-Vision-128K-Instruct是一个轻量级的多模态模型,专为图文对话场景设计。这个模型属于Phi-3系列,特别适合中小企业快速构建AI能力而无需投入大量硬件资…...

ANIMATEDIFF PRO特效揭秘:流体模拟技术深度解析

ANIMATEDIFF PRO特效揭秘:流体模拟技术深度解析 流体模拟一直是计算机图形学中最具挑战性的领域之一,而ANIMATEDIFF PRO的流体模拟技术正在重新定义AI生成视频的质量标准。 1. 流体模拟的技术核心 ANIMATEDIFF PRO的流体模拟技术建立在先进的物理引擎和…...

MedGemma X-Ray企业实操:与HIS/LIS系统API对接的轻量集成方案

MedGemma X-Ray企业实操:与HIS/LIS系统API对接的轻量集成方案 1. 项目背景与需求分析 医疗影像AI系统在实际医院环境中部署时,最大的挑战是如何与现有的医院信息系统无缝集成。MedGemma X-Ray作为一款专业的胸部X光片智能分析平台,需要与医…...

SpringBoot 常用注解详解(附代码示例)

在 SpringBoot 开发中,注解是最核心的部分。 通过注解可以实现 自动配置、依赖注入、接口开发、数据库操作等功能。下面按照 实际开发使用频率进行分类讲解。一、SpringBoot 启动类注解1. SpringBootApplication这是 SpringBoot 项目的核心注解。作用:它…...

FireRedASR-AED-L模型Anaconda虚拟环境配置最佳实践

FireRedASR-AED-L模型Anaconda虚拟环境配置最佳实践 如果你正在研究语音识别,尤其是基于AED(Attention-based Encoder-Decoder)架构的模型,那么FireRedASR-AED-L模型很可能在你的待尝试清单里。不过,在跑通第一个Demo…...

Qwen3助力C语言教学:将抽象概念转化为可视化黑板报图解

Qwen3助力C语言教学:将抽象概念转化为可视化黑板报图解 你是不是也曾经对着C语言教材里那些关于指针、内存地址、链表结构的文字描述,感觉像在看天书?明明每个字都认识,连在一起却怎么也想象不出它到底在内存里是个什么样子。这种…...

MiniCPM-V-2_6嵌入式视觉应用实战:基于STM32F103C8T6的图像处理方案

MiniCPM-V-2_6嵌入式视觉应用实战:基于STM32F103C8T6的图像处理方案 最近在捣鼓一些嵌入式项目,发现一个挺有意思的事儿:现在很多智能硬件,比如智能门锁、工业质检设备,都想加上“眼睛”,也就是视觉识别功…...

20元玩客云打造全能服务器:LibreTV+远程唤醒+Docker保姆级配置指南

20元玩客云打造全能服务器:LibreTV远程唤醒Docker保姆级配置指南 在智能硬件玩家圈里,玩客云OneCloud早已成为性价比的代名词。这台原本设计用于区块链挖矿的设备,凭借其ARM架构的低功耗特性和完整的Linux系统支持,正在被越来越多…...

Thinkphp和Laravel框架都支持基于微信小程序的在线投票系统设计-

目录技术选型与框架对比数据库设计微信小程序端实现后端API开发安全与性能优化部署与测试项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术选型与框架对比 ThinkPHP和Laravel均为成熟的PHP框架&…...

STM32开发者必看:用J-Link RTT实现彩色日志输出(附代码示例)

STM32调试革命:J-Link RTT彩色日志全攻略 1. 嵌入式调试的痛点与RTT的崛起 调试信息输出一直是嵌入式开发中不可或缺的环节。传统方式通常依赖于串口打印,这种方式虽然简单直接,但也存在诸多限制:需要占用额外的硬件资源&#x…...

Gofile文件下载工具实战指南:从效率痛点到自动化解决方案

Gofile文件下载工具实战指南:从效率痛点到自动化解决方案 【免费下载链接】gofile-downloader Download files from https://gofile.io 项目地址: https://gitcode.com/gh_mirrors/go/gofile-downloader 在数字化工作流中,文件下载往往是最容易被…...

基于SpringBoot+Vue的城市垃圾分类管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】

摘要 随着城市化进程的加速和居民生活水平的提升,城市垃圾产量逐年攀升,传统的垃圾处理方式已难以满足环保和可持续发展的需求。垃圾分类管理成为现代城市治理的重要课题,亟需借助信息化手段提升管理效率。当前许多城市的垃圾分类仍依赖人工监…...

智能文献管理策略:解析六种AI辅助论文引用生成方案

核心工具对比速览 工具名称 核心优势 适用场景 处理速度 AiBiye 智能识别引用格式,自动匹配规范 学术论文初稿 3-5秒/页 AiCheck 深度检测引用缺失,精准定位问题 论文终稿检查 10秒/篇 AskPaper 多语言引用规范支持 国际期刊投稿 5-8秒/页…...

TreeSet |TreeMap|jar包|web包易混淆解答

刷牛客网机试题常见疑惑1 TreeSet是啥?TreeMap又是啥?这俩有啥用?两者都是基于红黑树,那红黑树又是啥?红黑树是一个自平衡的二叉查找树,遍历红黑树就会得到一个升序序列。在实际处理问题中,Set&…...

SAM 3视频分割应用:安防监控中人员/车辆轨迹追踪与区域掩码叠加分析

SAM 3视频分割应用:安防监控中人员/车辆轨迹追踪与区域掩码叠加分析 1. 引言:当监控视频“看懂”了世界 想象一下这个场景:一个大型商场的安保中心,墙上挂满了监控屏幕。值班人员需要时刻盯着屏幕,手动标记可疑人员的…...

智慧树课程自动化学习:高效工具实用指南

智慧树课程自动化学习:高效工具实用指南 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 一、问题引入:网课学习的隐形效率损耗 ⏳ 当你每天需要…...