数据结构——最大堆最小堆

数据结构与算法--二叉堆(最大堆,最小堆)实现及原理 二叉堆(最大堆,最小堆)实现及原理 二叉堆与二叉查找树一样,堆也有两个性质,即结构性质和堆性质。和AVL树一样,对堆的一次操作必须到堆的所有性质都被满足才能终止,也就是我们每次对堆的操作都必须对堆中的数据进行校正才能终止。 结构性质 堆是一颗被填满的二叉树,除了最底层上的元素是不满的,但是最底层元素必须是从左到右填入。这样的树称为完全二叉树(complete binary tree),如下就是一个二叉堆的案例: 容易得到的一个层级与节点数的一个结论是,如果有一棵高度 h 的完全二叉树,节点数在 阅读详情

定义:
最大堆和最小堆都是一棵完全二叉树。

最大堆:是指根节点的关键字值是堆中的最大关键字值,且每个节点若有儿子节点,其关键字值都不小于其儿子节点的关键字值。

最小堆:是指根节点的关键字值是堆中的最小关键字值,且每个节点若有儿子节点,其关键字值都不大于其儿子节点的关键字值。

最大堆的插入操作
步骤:

1 把待增加的节点编号 i 设置为已知堆的总节点数加 1 即 i=++(*n),因此,新增的元素放在最下一层作为新的叶子节点。求出节点 i 的父节点 parent=i/2; 判断是否为空堆,并比较所插入元素与父节点关键字值的大小;
2 若所插入节点关键字值大于父节点关键字值即item>heap[parent],则把父节点向下移,并把父节点作为当前节点,依次求父节点,即依次沿着树枝向上延伸直到根节点;
3 把元素item插入到正确位置;

最大堆的删除操作
最大堆的删除,即删除最大的元素。我们先取最后的元素提到根结点,然后删除最大值,然后再把新的根节点放到合适的位置。

首先删除根节点,并把最后一个节点临时作为新的根节点,将新的根节点作为当前节点与其孩子节点中最大的关键值节点进行比较,若小于其孩子节点的关键值,则与其孩子节点进行交换位置,并把新位置作为当前节点继续与其孩子节点进行比较,一直延伸下去,直到没有孩子节点为止;

最大堆

#include <iostream>
using namespace std;
class HeapNode
{
public:
	operator double() const{return data;}
	int operator <= (HeapNode hn) const{return data<=hn.data;	}
	int operator <	(HeapNode hn) const{return data<hn.data;	}
	int operator >= (HeapNode hn) const{return data>=hn.data;	}
	int operator >	(HeapNode hn) const{return data>hn.data;	}
	int operator == (HeapNode hn) const{return data==hn.data;	}
    HeapNode(){}
    HeapNode(int id,double d)
    {
        ID=id;
        data=d;
    }
    int ID;
    double data;
};

class MaxHeap
{
public:
	MaxHeap(int n);    //构造函数,N表示堆中能存储的最大元素的个数 
	void Insert(HeapNode heapNode);  //向堆中插入一个结点 
	void DeleteMax(HeapNode &heapNode);  //删除堆中的最大结点 
private:
	int size;            
	HeapNode *MH;       
	
	void Delete(HeapNode &heapNode,int index);  //删除堆中标号为index的元素,index从1开始,即1表示最大元素 
	void SiftUp(int index);          //将堆中标号为index的元素,向上调整,保证堆结构 
	void SiftDown(int index);      //将堆中标号为index的元素,向下调整,保证堆结构 
};

MaxHeap::MaxHeap(int n)
{
	size=0;
	MH=new HeapNode[n];
}

void MaxHeap::SiftUp(int index)
{
	if(index<=1)
		return;
	bool done=false;
	do
	{
		if(MH[index]>MH[index/2])
		{
			HeapNode tmp=MH[index];
			MH[index]=MH[index/2];
			MH[index/2]=tmp;
		}
		else
			done=true;
		
		index=index/2;
	}while(index>1&&!done);
}

void MaxHeap::SiftDown(int index)
{
	if(2*index>size)
		return;
	bool done=false;
	do
	{
		index=2*index;
		if(index+1<=size&&MH[index+1]>MH[index])
			index=index+1;
		if(MH[index/2]<MH[index])
		{
			HeapNode tmp=MH[index];
			MH[index]=MH[index/2];
			MH[index/2]=tmp;
		}
		else
			done=true;
	}while(2*index<=size&&!done);
}

void MaxHeap::Insert(HeapNode heapNode)
{
	size+=1;
	MH[size]=heapNode;
	SiftUp(size);
}

void MaxHeap::Delete(HeapNode &heapNode,int index)
{
	if(index<1||index>size)
	{
		return;
	}
	HeapNode x=MH[index],y=MH[size];
	heapNode=MH[index];
	size-=1;
	if(index==size+1)
		return;
	MH[index]=y;//将原来堆中的最后一个放到要被删除的位置,再继续调整堆 
	if(y>=x)
		SiftUp(index);
	else
		SiftDown(index);
}

void MaxHeap::DeleteMax(HeapNode &heapNode)
{
	Delete(heapNode,1);
}
int main()
{
    double data[]={13,3,4,2,6,15,67,21,88};

    MaxHeap *Maxhp=new MaxHeap(100);
    for(int i=0;i<9;i++)
    {
        HeapNode hp(i+1,data[i]);
        Maxhp->Insert(hp);
    }
    for(int i=1;i<=9;i++)
    {  HeapNode hp2;
       Maxhp->DeleteMax(hp2);
        cout<<hp2.data<<'\t';
    }
    
    return 0;
}

在这里插入图片描述
最小堆

#include <iostream>
using namespace std;
class HeapNode
{
public:
	operator double() const{return data;}
	int operator <= (HeapNode hn) const{return data<=hn.data;	}
	int operator <	(HeapNode hn) const{return data<hn.data;	}
	int operator >= (HeapNode hn) const{return data>=hn.data;	}
	int operator >	(HeapNode hn) const{return data>hn.data;	}
	int operator == (HeapNode hn) const{return data==hn.data;	}
    HeapNode(){}
    HeapNode(int id,double d)
    {
        ID=id;
        data=d;
    }
    int ID;
    double data;
};

class MinHeap
{
public:
	MinHeap(int n);
	void Insert(HeapNode heapNode);
	void DeleteMin(HeapNode &heapNode);
private:
	int size;
	HeapNode *MH;
	
	void Delete(HeapNode &heapNode,int index);
	void SiftUp(int index);
	void SiftDown(int index);
};

MinHeap::MinHeap(int n)
{
	size=0;
	MH=new HeapNode[n];
}

void MinHeap::SiftUp(int index)
{
	if(index<=1)
		return;
	bool done=false;
	do
	{
		if(MH[index]<MH[index/2])
		{
			HeapNode tmp=MH[index];
			MH[index]=MH[index/2];
			MH[index/2]=tmp;
		}
		else
			done=true;
		index=index/2;
	}while(index>1&&!done);
}

void MinHeap::SiftDown(int index)
{
	if(2*index>size)
		return;
	bool done=false;
	do
	{
		index=2*index;
		if(index+1<=size&&MH[index+1]<MH[index])
			index=index+1;
		if(MH[index/2]>MH[index])
		{
			HeapNode tmp=MH[index];
			MH[index]=MH[index/2];
			MH[index/2]=tmp;
		}
		else
			done=true;
	}while(2*index<=size&&!done);
}

void MinHeap::Insert(HeapNode heapNode)
{
	size+=1;
	MH[size]=heapNode;
	SiftUp(size);
}

void MinHeap::Delete(HeapNode &heapNode,int index)
{
	if(index<1||index>size)
	{
		return;
	}
	HeapNode x=MH[index],y=MH[size];
	heapNode=MH[index];
	size-=1;
	if(index==size+1)
		return;
	MH[index]=y;
	if(y<=x)
		SiftUp(index);
	else
		SiftDown(index);
}

void MinHeap::DeleteMin(HeapNode &heapNode)
{
	Delete(heapNode,1);
}
int main()
{
    double data[]={13,3,4,2,6,15,67,21,88};

    MinHeap *Minhp=new MinHeap(100);
    for(int i=0;i<9;i++)
    {
        HeapNode hp(i+1,data[i]);
        Minhp->Insert(hp);
    }
    for(int i=1;i<=9;i++)
    {  HeapNode hp2;
       Minhp->DeleteMin(hp2);
        cout<<hp2.data<<'\t';
    }
    
    return 0;
}

在这里插入图片描述

堆的概念(最大堆和最小堆)以及使用堆的实际应用场景 然而,在大多数情况下,这种空间利用率的损失是可以接受的,因为堆的主要优势在于其高效的插入、删除和查找最大。首先构建最大堆或最小堆,然后将堆顶元素(最大值或最小值)与堆尾元素交换,并减少堆的大小,再对新的堆顶元素进行下沉操作,重复此过程直到堆的大小为。:堆的物理结构是顺序存储的,即使用数组来表示,且满足完全二叉树的性质,即除了最后一层外,每一层都被完全填满,且所有节点都尽可能地向左侧对齐。:如果某个任务的优先级发生变化,可以在堆中找到该任务节点,调整其值,并重新进行堆的调整(上移或下移),以保持堆的性质。 阅读详情

相关推荐

数据结构——最大堆和最小堆(C语言)

定义: 最大堆和最小堆都是一棵完全二叉树。 最大堆:是指根节点的关键字值是堆中的最大关键字值,且每个节点若有儿子节点,其关键字值都不小于其儿子节点的关键字值。 最小堆:是指根节点的关键字值是堆中的最小关键字值,且每个节点若有儿子节点,其关键字值都不大于其儿子节点的关键字值。 以下的操作以最大堆为例,最小堆相似。 最大堆的插入操作 步骤: 1、把当前节点数i设置为已知堆的节

关注校招求职,微信号:job_campus 1万+

最大堆和最小堆

堆的特性 必须是完全二叉树 用数组实现 任一结点的值是其子树所有结点的最大值或最小值 最大值时,称为“最大堆”,也称大顶堆; 最小值时,称为“最小堆”,也称小顶堆。 最大堆: 最小堆: 对于堆(Heap)这种数据结构,从根节点到任意结点路径上所有的结点都是有序的 堆的实现 在堆中,一般将数组第一个元素赋值为null,不用数组第一位,所以 根节点:n 左子树则为...

kevin的博客 3675

数据结构 堆树(最大堆、最小堆)

一、堆树的定义 (1)堆树是一颗完全二叉树; (2)堆树中某个节点的值总是不大于或不小于其孩子节点的值; (3)堆树中每个节点的子树都是堆树。 当父节点的键值总是大于或等于任何一个子节点的键值时为最大堆,也称大根堆。 当父节点的键值总是小于或等于任何一个子节点的键值时为最小堆,也称小根堆。 如下图所示,上边为最大堆,下边为最小堆。 二、堆树的操作 下面以最大堆为例进行讲解,最小堆同理。 2.1...

Markus 5460

数据结构堆(Heap)详解-堆的建立、插入、删除、最大堆、最小堆、堆排序等

基本概念: 1、完全二叉树:若二叉树的深度为h,则除第h层外,其他层的结点全部达到最大值,且第h层的所有结点都集中在左子树。 2、满二叉树:满二叉树是一种特殊的的完全二叉树,所有层的结点都是最大值。 什么是堆? 堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质: 堆中某个节点的值总是不大于或不小于其父节点的值; ...

SmallBottle-CGWLMX的博客 10万+

聊聊 Java 数据结构与算法中的堆最小堆和最大堆

堆的数据结构有很多种体现形式,包括;2-3堆、B堆、斐波那契堆,而在 Java API 中最常用的是用于实现优先队列的二叉堆,它是由 JWJ Williams 在 1964 年引入的,作为堆排序算法的数据结构。另外在 Dijkstra 算法等几种高效的图算法中,堆也是非常重要的。堆的实现在 Java API 中主要体现在延迟队列的实现二叉堆上,这里小傅哥单独把这部分代码拆分出来,了解下关于小堆和大堆的实现。从对堆的数据结构介绍上可以看到,小堆和大堆的唯一区别仅是对元素的排序方式不同。

Huangjiazhen711的博客 677

掌握堆数据结构:贪心算法与最小-最大堆的实战应用

本文详细介绍了堆数据结构在贪心算法中的应用,以及最小-最大堆的定义、性质和操作。通过对贪心分数背包问题和活动选择问题的分析,展示了如何使用最大堆和最小堆来优化算法效率。同时,探讨了霍夫曼编码问题中堆数据结构的使用,并提出了最小-最大堆的数据结构及其在删除最大值和最小值操作中的优势。本文还提供了检查和插入操作的算法,并通过实例图解说明了操作过程。

weixin_42510243的博客 493

【重学数据结构】堆 Heap - 最小堆&最大堆

堆是一种基于完全二叉树的数据结构,分为最小堆和最大堆两种形式。最小堆中每个父节点的值都小于或等于子节点,最大堆则相反。堆通常用数组实现,主要操作包括入堆(上浮调整)和出堆(下沉调整)。Java中常用堆实现优先队列。本文详细介绍了堆的接口定义、核心实现逻辑(包含扩容机制),并通过具体代码示例展示了最小堆和最大堆的实现差异。测试案例验证了堆的正确性,最后总结了堆的特点、应用场景(如堆排序、TopN问题)以及最小堆与最大堆的本质区别。

先做到 再看见 682

保姆级教程:用Fiddler+夜神模拟器搞定抖音App抓包(附SSL Pinning绕过实战)

本文提供了一套完整的移动端抓包解决方案,详细介绍了如何使用Fiddler和夜神模拟器进行抖音App抓包,并重点讲解了SSL Pinning绕过技术。通过Xposed框架和JustTrustMe模块的组合,实现高效抓包,适用于产品分析、竞品研究和安全测试等场景。

weixin_30855099的博客 421

最大堆和最小堆(数据结构)

堆和栈的区别: 一、空间分配区别: 栈(操作系统):由操作系统自动分配释放,存放函数的参考值,局部变量的值等。其操作方式类似于数据结构中的栈 堆(操作系统):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式类似于链表 二、缓存方式区别: 栈使用的是一级缓存,他们通常都是被调用时处于存储空间中,调用完毕立即释放 堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦称为孤儿对象就能被回收),所以调用这些对象的速度相对低 三、数据结构区别: 堆(数据结构):堆可

Jasmine的博客 2020

Jetson Orin NX系统克隆术:如何快速备份与还原你的开发环境(附完整命令行)

本文详细介绍了Jetson Orin NX系统克隆的完整流程,这是一种超越简单备份的完整镜像方案。通过命令行操作,可实现开发环境(包括引导程序、内核、根文件系统及所有配置)的快速备份与还原,确保批量部署时环境的完全一致性与高效性,尤其适合机器人、边缘AI等项目的团队协作。

weixin_29191081的博客 156

EFR32BG22 Thunderboard开发板 使用SPI 读取加速度计

Simplicity Studio v5 创建Silicon Labs蓝牙SoC EFR32BG22 Thunderboard模块的加速度计工程,模块上有一个ICM-20648 6轴运动跟踪设备,集成3轴加速度计和3轴陀螺仪功能,使用SPI接口跟EFR32BG22芯片连接。 我尽量以图片的形式展示(少打字): 将EFR32BG22的Thunderboard模块通过USB线插入到电脑,打开Simplicity Studio v5软件。 下面看重点: 点击搜索到的IO Stream: USART,点击Ins

qq_25727979的博客 1494

数据结构--最小堆、最大堆(小根堆、大根堆)

1.最小堆的实现参考:https://blog.youkuaiyun.com/genios/article/details/8157031 int a[N]; void Build(){ for(int i=n/2;i>=1;i--){ int tem=a[i]; int j=i*2; while(j<=n){ if...

c___c18的博客 1539

Nvidia Tesla A100 驱动安装方法

Nvidia Tesla A100 驱动安装方法 遇到的问题:以前安装tesla系列、geforce系列等gpu 驱动的时候,只需执行nvidiaxxxx.run驱动包或者安装nvidiaxxxx.rpm包即可,但遇到新的GPU Nvidia Tesla A100的时候,安装完驱动似乎不起作用,找了半天资料,原来需要以下步骤才可以使用;

qq_24343177的博客 2万+

【数据结构】最大堆和最小堆

洛谷里考的一道题 MinHeap #include <cstring> template <typename ValueType> class MinHeap{ public: MinHeap(); ~MinHeap(); void push(ValueType const &n); void pop(); ValueType top(); int size(); bool empty(); private: ValueType* heap; int le

feb_24的博客 423

C++跨平台Word文档处理库DuckX实战指南:从原理到项目集成

在C++开发中,处理Office文档,尤其是Word文件,常因缺乏原生易用的库而面临挑战。Office Open XML(OOXML)作为.docx文件的基础标准,其本质是包含XML文件的ZIP压缩包。理解这一原理,开发者便能通过解析和操作XML来实现文档的读写。DuckX库正是基于此,为C++提供了轻量级的解决方案。它封装了底层的ZIP处理和XML解析,提供了简洁的面向对象API,其技术价值在于实现了跨平台、无外部依赖的Word文档自动化生成与处理。这尤其适用于服务器端、嵌入式环境或需要脱离Office软

weixin_33508411的博客 387

OpenLayers6入门,快速搭建Vue+OpenLayers地图脚手架项目

本章针对Vue初学者,对Vue不熟悉,甚至还不会Vue的入门学生读者。本章会详细讲解从环境到环境的各个步骤,再到使用脚手架快速生成项目,以及添加地图库依赖,编写简单的高德地图显示页面的。如果已有VUE项目或者熟悉VUE的读者可以不用看本章,直接添加ol依赖到VUE项目中即可。

GIS技术方向,GIS地图技术分享(GIS入门、Openlayers教程、Leaflet教程),做最好的GIS地图开发教程。关注博主公众号:eguid 5440

基本数据结构之最大堆最小堆

基本数据结构之最大堆最小堆 堆是这样的一种数据结构,

一蓑烟雨任平生,也无风雨也无晴! 1853

多思计组实验实验三、存储器读写实验

实验三、存储器读写实验

qq_53089329的博客 3651

数据结构-堆(heap)最大堆、最小堆的相关操作和实战

堆(heap) 堆的概念: 是完全二叉树; 每个节点 >= 或 <= 孩子节点。 条件二中分别对应:最大堆和最小堆。 最大堆:最大值为堆顶元素,每个节点 >= 孩子节点。 最小堆:最小值为堆顶元素,每个节点 <= 孩子节点。 python中的堆 python中只能直接创建最小堆。如果想要创建最大堆可以先将所有元素乘负一(取反),然后最小堆化,取元素的时候再取反,这样相当于得到最大堆。 应用:top – K、第K个最大值,每次可以取出最大(最小元素) 堆化:把一组无序的

qq_34184505的博客 1441

【动态导通电阻】GaN HEMT动态导通电阻的精确测量

2023年7月,瑞士洛桑联邦理工学院的Hongkeng Zhu和Elison Matioli在《IEEE Transactions on Power Electronics》期刊发表文章,提出了一种稳态测量方法,用于研究氮化镓(GaN)高电子迁移率晶体管(HEMT)的动态导通电阻(Ron)。实验结果显示,商业GaN器件在稳态下的动态Ron变化显著,稳定时间可达数分钟且与电压相关。传统的脉冲测量方法由于测试时间不足,可能导致结果不准确。该

荷塘阅色 1376

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

最大堆、最小堆数据结构详细解读

堆广泛用于优先队列、排序算法(如堆排序)、调度系统等场景。下面是对最大堆和最小堆的详细介绍。

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 3671

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++最小堆的数据结构(插入删除)+使用最大堆进行堆排序

1.最小堆的数据结构实现 #include "iostream" #include "vector" using namespace std; //最小堆 void DownHeap(vector<int>& arr,int lo,int hi){ //i应该被初始化为父节点,j为i节点的左节点 int i=lo,j=2*i+1; //如果还存在孩子节点则一直比较并进行调整,hi为数组长度 while(j<hi){ //如果右节点存

qq_45856311的博客 841

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: 算法设计与分析——分支限界法——装载问题
下一篇: 算法设计与分析——分支限界法——布线问题
943802606
博客等级 码龄6年 1万+粉丝 177原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值