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

堆及其应用

堆是一种基于树结构的数据结构,通常用于实现优先队列。堆分为最大堆和最小堆两种类型,最大堆的每个节点的值都大于等于其子节点的值,最小堆则相反,每个节点的值都小于等于其子节点的值。

基础算法操作包括:

1. 插入元素:将新元素插入堆的末尾,然后通过上滤操作将其移到正确的位置。

2. 删除堆顶元素:将堆顶元素与堆末尾元素交换,然后将堆末尾元素删除,最后通过下滤操作将堆顶元素移到正确的位置。

3. 上滤操作:将一个新元素插入堆末尾后,将其与其父节点比较,如果大于等于父节点,则不需要操作;否则将其与父节点交换,然后继续向上比较,直到达到堆顶或者不需要交换为止。

4. 下滤操作:将堆顶元素与其子节点比较,如果小于等于子节点,则不需要操作;否则将其与子节点中较大(或较小)的那个交换,然后继续向下比较,直到达到堆底或者不需要交换为止。

5. 建堆操作:将一个无序序列转化为堆的过程,可以通过从最后一个非叶子节点开始进行下滤操作,直到堆顶。

以下是基于数组实现的最小堆,包括插入元素、删除堆顶元素、上滤操作、下滤操作和建堆操作的实现。

应用场景:

堆是一种数据结构,具有动态分配内存、动态扩容等特点,在计算机科学中有许多应用场景。以下是堆的几个应用场景:

1. 内存管理

堆常用于动态分配内存,例如在程序运行时需要创建一个动态数组,但是数组的大小在编译时是未知的,这时可以使用堆来动态分配内存。C语言中的malloc和free函数就是堆的常见应用。

2. 优先队列

堆可以用来实现优先队列,即队列中的元素按照某种优先级排序,每次取出的元素是优先级最高的。堆实现优先队列的时间复杂度为O(logn),比其他实现方式的时间复杂度低,因此在需要高效实现优先队列的场景中,堆是一个常见的选择。

3. 排序算法

堆排序是一种高效的排序算法,它的时间复杂度为O(nlogn),与快速排序、归并排序等常见的排序算法相当。堆排序的基本思路是将待排序的元素构建成一个二叉堆,然后每次取出堆顶的元素,将其放到已排序的序列中,再对剩余的元素重新构建堆。

4. 图算法

在图算法中,堆常用于实现Dijkstra算法和Prim算法。Dijkstra算法是一种求解单源最短路径问题的算法,它通过维护一个距离起点最短的节点集合,不断扩展该集合来求解最短路径。Prim算法是一种求解最小生成树问题的算法,它通过维护一个已经生成的树的节点集合,不断将与该集合相邻的未被访问的节点加入集合中,直到生成一棵最小生成树。

5. 操作系统

堆在操作系统中也有广泛的应用,例如进程管理中的内存分配和释放、虚拟内存管理中的页面置换等。在进程管理中,堆用于动态分配进程的堆内存,以及动态加载和卸载动态链接库。在虚拟内存管理中,堆可以用于实现页面置换算法中的优先队列,以便快速选择需要置换的页面。

```c++

#include <iostream>
#include <vector>using namespace std;class MinHeap {
private:vector<int> heap; // 存储堆的数组// 上滤操作void siftUp(int index) {while (index > 0) {int parent = (index - 1) / 2;if (heap[parent] > heap[index]) {swap(heap[parent], heap[index]);index = parent;} else {break;}}}// 下滤操作void siftDown(int index) {int size = heap.size();while (index * 2 + 1 < size) {int leftChild = index * 2 + 1;int rightChild = index * 2 + 2;int minIndex = leftChild;if (rightChild < size && heap[rightChild] < heap[leftChild]) {minIndex = rightChild;}if (heap[minIndex] < heap[index]) {swap(heap[minIndex], heap[index]);index = minIndex;} else {break;}}}public:// 插入元素void insert(int val) {heap.push_back(val);siftUp(heap.size() - 1);}// 删除堆顶元素void deleteMin() {int size = heap.size();if (size == 0) {return;}heap[0] = heap[size - 1];heap.pop_back();siftDown(0);}// 建堆操作void buildHeap(vector<int>& nums) {heap = nums;int size = heap.size();for (int i = size / 2 - 1; i >= 0; i--) {siftDown(i);}}// 获取堆顶元素int getMin() {return heap.size() == 0 ? -1 : heap[0];}// 获取堆的大小int size() {return heap.size();}// 判断堆是否为空bool empty() {return heap.empty();}
};int main() {MinHeap heap;heap.insert(3);heap.insert(2);heap.insert(1);cout << heap.getMin() << endl; // 1heap.deleteMin();cout << heap.getMin() << endl; // 2heap.insert(0);cout << heap.getMin() << endl; // 0vector<int> nums = {5, 4, 3, 2, 1};heap.buildHeap(nums);while (!heap.empty()) {cout << heap.getMin() << " ";heap.deleteMin();} // 1 2 3 4 5return 0;
}


```

相关文章:

堆及其应用

堆是一种基于树结构的数据结构&#xff0c;通常用于实现优先队列。堆分为最大堆和最小堆两种类型&#xff0c;最大堆的每个节点的值都大于等于其子节点的值&#xff0c;最小堆则相反&#xff0c;每个节点的值都小于等于其子节点的值。 基础算法操作包括&#xff1a; 1. 插入元…...

MySQL数据库备份脚本

PS&#xff1a;此脚本简单易懂&#xff0c;根据实际情况修改个别参数测试后即可使用&#xff0c;如有错误请指出&#xff01; 1.MySQL数据库备份脚本 #!/bin/bashuser pw ip dateYdate "%Y" date2date "%Y%m%d" date3date "%Y%m%d %H:%M" date…...

【2023 · CANN训练营第一季】应用开发深入讲解——第三章应用调试

学习资源 日志参考文档 应用开发FAQ 日志主要用于记录系统的运行过程及异常信息&#xff0c;帮助快速定位系统运行过程中出现的问题以及开发过程中的程序调试问题。 日志分为如下两大类&#xff1a; 系统类日志&#xff1a;系统运行产生的日志。主要包括&#xff1a; Contro…...

黎曼几何与黎曼流形

目录 0.黎曼几何 1. 欧几里得几何与黎曼几何的区别 2.黎曼流形 3.黎曼距离 4.切空间 5.黎曼均值 6. SPD矩阵如何形成黎曼流型 7.切线空间映射 8.同余变换和同余不变 9.黎曼对齐 科普性笔记&#xff0c;做了解&#xff0c;不深入。 0.黎曼几何 黎曼几何是一种基于欧几…...

lua | 运算符与字符串

目录 一、运算符 算数运算符 关系运算符 逻辑运算符 其他运算符 运算符优先级 二、字符串 转义字符 方法与用途 字符串截取 字符串大小转换 字符串查找与反转 字符串格式化 字符与整数的转换 匹配模式 本文章为笔者学习分享 学习网站&#xff1a;Lua 基本语法 | …...

NetBackup 10.2 新功能介绍:PostgreSQL 和 MySQL 自动化恢复达成

NetBackup 10.2 新功能介绍&#xff1a;PostgreSQL 和 MySQL 自动化恢复达成 原文来自&#xff1a;VERITAS 中文社区 2023-04-27 在执行恢复任务时&#xff0c;手动提取、更新数据库和实例并将其附加到 PostgreSQL 和 MySQL 是常规操作。而在最新的 NetBackup 10.2 版本中&am…...

ADRV9002官方例程开发过程中遇到的问题

开发环境&#xff1a;Vivado2021.2 HDL版本&#xff1a;hdl_2021_r2 GitHub - analogdevicesinc/hdl at hdl_2021_r2 no-OS版本&#xff1a;no_OS-2021_R2 GitHub - analogdevicesinc/no-OS at 2021_R2 &#xff08;PS&#xff1a;也可以用Vivado2019.1开发&#xff0c…...

Figma转换为sketch,分享这3款工具

在我们的设计工作中&#xff0c;我们经常会遇到各种各样的设计文件相互转换的问题。 你经常为此头疼吗&#xff1f;当你遇到Figma转换Sketch文件的问题时&#xff0c;你是如何解决的&#xff1f;Figma转换Sketch文件有工具吗&#xff1f; 根据众多设计师的经验&#xff0c;本…...

淘宝天猫1688京东商品详情API接口,封装接口可高并发

要提供商品详情数据需要知道具体的商品信息&#xff0c;但通常商品详情数据应包括以下内容&#xff1a; 商品名称&#xff1a;商品的名称&#xff0c;以方便顾客对其进行识别和区分。 商品描述&#xff1a;一段让顾客能够全面认识商品的描述。应能够有效地展示商品的特性、功能…...

虹科荣誉 | 虹科工业物联网产品荣获中国自动化产业年会用户信赖产品奖!

2023 虹科荣获2021年度中国自动化产业年会用户信赖产品奖 近日&#xff0c;2023中国自动化产业年会于北京隆重举行。虹科工业物联网的产品“OPC UA Tunneller软件”凭借其产品优势和市场美誉度&#xff0c;通过层层选拔&#xff0c;在本次大会中荣获2021年度用户信赖产品奖。…...

SwiftUI 如何让文本自动支持查找和替换功能?

概览 有些情况下&#xff0c;我们需要为文本编辑器实现文本的查找和替换功能&#xff08;find & replace&#xff09;&#xff0c;如果完全靠自已撸码还是比较棘手的。 所幸的是&#xff0c;从 SwiftUI 4.0 &#xff08;iOS 16&#xff09;开始&#xff0c;Apple 已经将查…...

SpringCloud全面学习笔记之初尝美妙篇

目录 前言初识微服务单体架构分布式架构微服务架构初见SpringCloud微服务治理分布式服务架构案例 微服务组件及使用Eureka注册中心提供者和消费者Eureka的结构和作用搭建Eureka服务注册服务服务发现Eureka注册服务总结 Ribbon负载均衡原理负载均衡原理负载均衡策略懒加载 Nacos…...

Spring MVC框架

Spring MVC框架 Spring MVC属于SpringFrameWork的后续产品&#xff0c;已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构&#xff0c;从而在使用Spring进行WEB开发时&#xff0c;可以选择使用Spring的Spri…...

Illustrator如何使用图层与蒙版之实例演示?

文章目录 0.引言1.绘制可爱冰淇淋图标2.霓虹渐变立体文字海报3.炫彩花纹背景 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对Illustrator进行了学习&#xff0c;本文通过《Illustrator CC2018基础与实战》及其配套素材结合网上相关资料进行学习笔记总结&#xff0c;…...

Office Tool Plus的使用

是否为安装&#xff0c;卸载&#xff0c;激活Office而烦恼&#xff1f; 下载 地址&#xff1a;Office Tool Plus 官方网站 - 一键部署 Office 安装office 先安装Office&#xff0c;Office_Pro_Plus_2021_LTSCProjectVisio_x64_zh_CN_VL_2022-02 注意&#xff0c;要安装批量…...

​射频PCB 设计​的六大条技巧

即使是最自信的设计人员&#xff0c;对于射频电路也往往望而却步&#xff0c;因为它会带来巨大的设计挑战&#xff0c;并且需要专业的设计和分析工具。这里将为您介绍六条技巧&#xff0c;来帮助您简化任何射频PCB 设计任务和减轻工作压力&#xff01; 1、保持完好、精确的射频…...

优化了成本和安装难度后,UWB信标能否取代蓝牙信标?

1 我们做安U3号是要解决什么问题&#xff1f; &#xff08;1&#xff09;信标式设计&#xff0c;解决传统UWB基站安装过程繁琐复杂的问题 传统UWB基站在安装过程中遇上的难题&#xff1a; l 安装位置选取问题&#xff1a;UWB基站的准确度与其安装位置有很大关系&#xff0c;…...

深入理解Java虚拟机——垃圾回收算法

1.前言 垃圾回收需要完成的三件事 首先我们需要明白垃圾回收需要完成的三件事&#xff1a; 哪些内存需要回收 堆内存中的对象所使用的内存方法区中的废弃的常量以及不再使用的类型 什么时候回收 当对象死亡方法区中某些内容&#xff08;常量和类型&#xff09;不再被使用 如…...

git-rebase和merge

A-----B----C----D master E----F-----G feature 为了把main分支里新增的代码应用在你的feature分支&#xff0c;你有两种方法&#xff1a;merge 和 rebase。 merge git checkout feature git merge main A-----B----C----D master E----F-----G -----* feature (合并master…...

【JavaWeb 用户认证】Cookie、Session、Token、JWT、Interceptor、SpringBoot、Spring Security

Token基本了解&#xff1a;【详细阐述Token的来源】公钥私钥基本了解&#xff1a;【理解公钥】 文章目录 一、Cookie 经典介绍以及使用案例二、Session 经典介绍以及拦截登录案例三、Token MySQL 的基本介绍及其基本使用四、JWT 基本介绍及其基本讲解五、SpringBoot 使用拦截器…...

6个月的测试,来面试居然要15K,我一问连5K都不值

2023年4月份我入职了深圳某家创业公司&#xff0c;刚入职还是很兴奋的&#xff0c;到公司一看我傻了&#xff0c;公司除了我一个自动化测试&#xff0c;公司的测试人员就只有2个开发3个前端1个测试还有2个UI&#xff0c;在粗略了解公司的业务后才发现是一个从零开始的项目&…...

RSA--维纳攻击--代码和题目分析

文章目录 维纳攻击原理&#xff1a;维纳攻击脚本[羊城杯 2020]RRRRRRRSA 1题目描述&#xff1a;题目分析&#xff1a; 收获与体会&#xff1a; 维纳攻击原理&#xff1a; 两位大佬讲得非常清楚&#xff08;搬运工就是我&#xff09;&#xff1a;https://zhuanlan.zhihu.com/p/…...

飞腾ft2000-麒麟V10-SP1安装Docker、运行gitlab容器

目录 一、安装及配置docker 1、卸载docker相关包及删除相关配置文件 2、安装二进制docker 1.下载软件包 2.解压 3.修改镜像加速地址 4.修改profile文件 5.启动docker 6.docker常用命令 二、安装并启动gitlab镜像 1.安装gitlab镜像 1.查询满足使用需求的gitlab版本 2…...

C++ 的类型转换

目录 1. C语言中的类型转换 2. C强制类型转换 2.1static_cast 2.2 reinterpret_cast 2.3 const_cast 2.4 dynamic_cast 3. RTTI&#xff08;了解&#xff09; 1. C语言中的类型转换 在 C 语言中&#xff0c;如果 赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不…...

【Windows】普通控制台EXE程序转为windows服务方式运行的详细步骤

背景 NSSM&#xff08;Non-Sucking Service Manager&#xff09;是一个免费的第三方Windows服务管理器&#xff0c;可以将任何可执行文件转换为Windows服务。官网下载地址为&#xff1a;https://nssm.cc/download 以下是NSSM配置Windows服务的详细步骤和注意事项&#xff1a; …...

NSSCTF [suctf 2019]hardcpp WP 控制流混淆

下载文件&#xff0c;64位主函数非常多循环 去控制流混淆&#xff0c;脚本下载deflat 用法 python 脚本名 文件名 起始地址例如主函数地址是0x4007E0 python deflat.py hardCpp 0x4007E0然后就生成了去混淆的文件 主函数非常大&#xff0c;开始分析逻辑 puts("func(?…...

计算机毕业论文内容参考|基于神经网络的网络安全态势感知技术研究

文章目录 导文文章重点摘要前言绪论课题背景国内外现状与趋势课题内容相关技术与方法介绍技术分析技术设计技术实现总结与展望导文 基于神经网络的网络安全态势感知技术研究 文章重点 摘要 随着互联网的快速发展,网络攻击的频率和复杂度也在逐年增加。为了更好地保护信息系统…...

Flask框架之Request、Response、Cookies、Session等对象的使用

Request、Response、Cookies、Session等对象的使用 Request对象基本使用参数的获取转换器内置转换器自定义转换器 Response对象基本使用返回模板重定向返回JSON Cookies对象设置cookie获取cookie删除cookie Session会话对象设置SECRET_KEY设置会话获取会话释放会话 Request对象…...

信号与槽机制一

一、信号与槽 1、什么是信号与槽&#xff1f; 信号和槽是用于对象之间的通信&#xff0c;它是Qt的核心机制&#xff0c;在Qt编程中有着广泛的应用。如果想学好Qt&#xff0c;一定要充分掌握信号的槽的概念与使用。 2、信号和槽的代码实例 在Qt中&#xff0c;发送对象、发送的信…...

nodejs 复制文件到指定目录

var fs require(fs), path require(path), exec require(child_process).exec, sourcePath, targetPath; //获取命令行中的路径 process.argv.forEach(function (val, index, array) { if (index 2) { sourcePath val; } if (index 3) { targetPath val; } }); // 定义…...

wordpress模版c2c商城/百度软件应用中心

视频教程&#xff1a;http://pan.baidu.com/s/1kXBQj memcached是一套分布式的快取系统&#xff0c;当初是Danga Interactive为了LiveJournal所发展的&#xff0c;但被许多软件&#xff08;如MediaWiki&#xff09;所使用。这是一套开放源代码软件&#xff0c;以BSD license授权…...

无法访问服务器上网站/互联网广告公司

本文主要讲诉在使用VS2012SQL Server数据库做系统中,通常会遇到几个问题.使用dataGridView控件在修改、删除、插入数据后,怎样刷新数据显示操作后的结果.同时在对数据操作时通常会判断数据的主键是否存在或重复,判断外键是否重复,这几个问题我推荐使用函数的形式完成,同时推荐一…...

云服务器怎么建设网站/怎么自己刷推广链接

from jupyterthemes import get_themes import jupyterthemes as jt from jupyterthemes.stylefx import set_nb_theme set_nb_theme(solarizedd)...

甘肃 政府 网站建设/百度人工在线客服

一、 linux文件系统 linux使用标准的目录结构&#xff0c;在安装的时候&#xff0c;安装程序就已经为用户创建了文件系统和完整而固定的目录组成形式&#xff0c;并指定了每个目录的作用和其中的文件类型。 文件系统树状结构如下&#xff1a; / 根目录 ┏━━━┳━━━┳━━…...

wordpress 筛选 文章/知名的网络推广

整个项目包含了&#xff1a;开题报告 开题报告PPT 任务书 中期报告 论文模板 答辩PPT等 项目源码 主要安介绍了系统在开发过程中所应用到的一些关键的技术&#xff0c;主要包括了前端小程序开发的MINA框架&#xff1b;后台开发java的框架springboot、模板引擎 thymeleaf…...

兰州新区建设厅网站/长沙服务好的网络营销

这周看了下《JavaScript语言精粹》&#xff0c;总结几点如下&#xff1a; 一切皆是对象&#xff08;除了基本类型&#xff09; 对象是通过函数创建的 var obj {} // 其实是这样的 obj&#xff1d;new Object(); //Object 是一个函数 函数都有一个属性叫prototype&#xf…...