iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++数据结构之堆的概念是什么
  • 829
分享到

C++数据结构之堆的概念是什么

2023-06-29 23:06:52 829人浏览 八月长安
摘要

今天小编给大家分享一下c++数据结构之堆的概念是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。堆的概念堆(heap)是计

今天小编给大家分享一下c++数据结构之堆的概念是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    堆的概念

    堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象,即是一种顺序储存结构的完全二叉树

    提示:完全二叉树

    完全二叉树:对一棵深度为k、有n个结点二叉树编号后,各节点的编号与深度为k的满二叉树相同位置的结点的编号相同,这颗二叉树就被称为完全二叉树。[2]

    堆的性质

    • 堆中某个结点的值总是不大于或不小于其父结点的值

    • 堆总是一棵完全二叉树

    • 除了根结点和最后一个左子结点可以没有兄弟结点,其他结点必须有兄弟结点

    最大堆最小堆

    • 最大堆:根结点的键值是所有堆结点键值中最大者,且每个结点的值都比其孩子的值大。

    • 最小堆:根结点的键值是所有堆结点键值中最小者,且每个结点的值都比其孩子的值小。

    代码

    定义

    有限数组形式
    int Heap[1024];    //顺序结构的二叉树

    若某结点编号为i,且存在左儿子和右儿子,则他们分别对应

    Heap[i*2+1];      //左儿子Heap[i*2+2];      //右儿子

    其父节点

    Heap[i/2];//i的父节点
    动态数组形式

    项目开发中,经常以动态数组形式出现,在本文主要对这种形式进行介绍

    //默认容量#define DEFAULT_CAPCITY 128typedef struct _Heap{int *arr;//储存元素的动态数组int size;//元素个数int capacity;//当前存储的容量}Heap;

    操作

    只使用InitHeap()函数进行初始化即可,AdjustDown()与BuildHeap()仅为堆建立时的内部调用

    向下调整结点
    • 以创建最大堆为例

    • 将“判断最大子结点是否大于当前父结点”处的>=改为<=即可创建最小堆

    //向下调整,将当前结点与其子结点调整为最大堆//用static修饰禁止外部调用static void AdjustDown(Heap& heap, int index){int cur = heap.arr[index];//当前待调整结点int parent, child;for (parent = index; (parent * 2 + 1) < heap.size; parent = child){child = parent * 2 + 1;//左子结点//取两个子结点中最大节点,(child+1)<heap.size防止越界if (((child + 1) < heap.size && (heap.arr[child] < heap.arr[child + 1])))child++;//判断最大子结点是否大于当前父结点if (cur >= heap.arr[child])//将此处的>=改成<=可构建最小堆{//不大于,不需要调整break;}else{//大于,则交换heap.arr[parent] = heap.arr[child];heap.arr[child] = cur;}}}
    建立堆
    //建立堆,用static修饰禁止外部调用static void BuildHeap(Heap& heap){int i;//从倒数第二层开始调整(若只有一层则从该层开始)for (i = heap.size / 2 - 1; i >= 0; i--){AdjustDown(heap, i);}}
    初始化
    //初始化堆//参数:被初始化的堆,存放初始数据的数组, 数组大小bool InitHeap(Heap &heap, int *orginal, int size){//若容量大于size,则使用默认量,否则为sizeint capacity = DEFAULT_CAPCITY>size?DEFAULT_CAPCITY:size;heap.arr = new int[capacity];//分配内存,类型根据实际需要可修改if(!heap.arr) return false;//内存分配失败则返回Falseheap.capacity = capacity;//容量heap.size = 0;//元素个数置为0//若存在原始数组则构建堆if(size>0){memcpy(heap.arr,orginal, size*sizeof(int));heap.size = size;//调整大小BuildHeap(heap);//建堆}return true;}
    打印堆
    • 实际上是一个层序遍历[4]

    //以树状的形式打印堆void PrintHeapAsTreeStyle(Heap hp){queue<int> que;int r = 0;que.push(r);queue<int> temp;while (!que.empty()){r = que.front();que.pop();if (r * 2 + 1 < hp.size) temp.push(r * 2 + 1);if (r * 2 + 2 < hp.size) temp.push(r * 2 + 2);if (que.empty()){cout << hp.arr[r] << endl;que = temp;temp = queue<int>();}elsecout << hp.arr[r] << " ";}}

    测试

    main函数
    int main(){Heap hp;int vals[] = { 1,2,3,87,93,82,92,86,95 };if (!InitHeap(hp, vals, sizeof(vals) / sizeof(vals[0]))){fprintf(stderr, "初始化堆失败!\n");exit(-1);}PrintHeapAsTreeStyle(hp);return 0;}
    结果
    9593 9287 1 82 386 2

    完整代码

    #include <iOStream>#include <queue>using namespace std;//默认容量#define DEFAULT_CAPCITY 128typedef struct _Heap {int* arr;int size;int capacity;}Heap;//向下调整,将当前结点与其子结点调整为最大堆static void AdjustDown(Heap& heap, int index){int cur = heap.arr[index];//当前待调整结点int parent, child;for (parent = index; (parent * 2 + 1) < heap.size; parent = child){child = parent * 2 + 1;//左子结点//取两个子结点中最大节点,(child+1)<heap.size防止越界if (((child + 1) < heap.size && (heap.arr[child] < heap.arr[child + 1])))child++;//判断最大子结点是否大于当前父结点if (cur >= heap.arr[child])//将此处的>=改成<=可构建最小堆{//不大于,不需要调整break;}else{//大于,则交换heap.arr[parent] = heap.arr[child];heap.arr[child] = cur;}}}//建立堆,用static修饰禁止外部调用static void BuildHeap(Heap& heap){int i;//从倒数第二层开始调整(若只有一层则从该层开始)for (i = heap.size / 2 - 1; i >= 0; i--){AdjustDown(heap, i);}}//初始化堆//参数:被初始化的堆,存放初始数据的数组, 数组大小bool InitHeap(Heap& heap, int* orginal, int size){//若容量大于size,则使用默认量,否则为sizeint capacity = DEFAULT_CAPCITY > size ? DEFAULT_CAPCITY : size;heap.arr = new int[capacity];//分配内存,类型根据实际需要可修改if (!heap.arr) return false;//内存分配失败则返回Falseheap.capacity = capacity;//容量heap.size = 0;//元素个数置为0//若存在原始数组则构建堆if (size > 0){memcpy(heap.arr, orginal, size * sizeof(int));heap.size = size;//调整大小BuildHeap(heap);//建堆}return true;}//以树状的形式打印堆void PrintHeapAsTreeStyle(Heap hp){queue<int> que;int r = 0;que.push(r);queue<int> temp;while (!que.empty()){r = que.front();que.pop();if (r * 2 + 1 < hp.size) temp.push(r * 2 + 1);if (r * 2 + 2 < hp.size) temp.push(r * 2 + 2);if (que.empty()){cout << hp.arr[r] << endl;que = temp;temp = queue<int>();}elsecout << hp.arr[r] << " ";}}int main(){Heap hp;int vals[] = { 1,2,3,87,93,82,92,86,95 };if (!InitHeap(hp, vals, sizeof(vals) / sizeof(vals[0]))){fprintf(stderr, "初始化堆失败!\n");exit(-1);}PrintHeapAsTreeStyle(hp);return 0;}

    以上就是“C++数据结构之堆的概念是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网其他教程频道。

    --结束END--

    本文标题: C++数据结构之堆的概念是什么

    本文链接: https://www.lsjlt.com/news/326682.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • C++数据结构之堆的概念是什么
      今天小编给大家分享一下C++数据结构之堆的概念是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。堆的概念堆(heap)是计...
      99+
      2023-06-29
    • Java 数据结构之堆的概念与应用
      目录什么是堆堆的类型小根堆大根堆堆的基本操作:创建堆堆的时间复杂度和空间复杂度堆的应用-优先级队列概念优先级队列基本操作入优先级队列出优先级队列首元素java的优先级队列堆的常见面试...
      99+
      2022-11-12
    • Java数据结构之链表的概念及结构是什么
      今天小编给大家分享一下Java数据结构之链表的概念及结构是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、 链表的概念...
      99+
      2023-07-05
    • C++数据结构之堆详解
      目录堆的概念提示:完全二叉树堆的性质最大堆最小堆代码定义有限数组形式动态数组形式操作向下调整结点建立堆初始化打印堆测试main函数结果完整代码堆的概念 堆(heap)是计算机科学中一...
      99+
      2022-11-13
    • Java数据结构之链表的概念及结构
      目录1、链表的概念2、结点3、链表的使用场景4、链表分类和常用结构5、与顺序表的比较1、链表的概念 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链...
      99+
      2023-05-14
      Java 数据结构链表概念结构 数据结构链表概念 数据结构链表结构
    • 数据库数据结构的基本概念是什么
      这篇文章主要介绍“数据库数据结构的基本概念是什么”,在日常操作中,相信很多人在数据库数据结构的基本概念是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”数据库数据结构的基本概念是什么”的疑惑有所帮助!接下来...
      99+
      2023-06-19
    • Python 数据结构之树的概念详解
      数据结构树简介 一、树简介 树(Tree)是一种抽象的数据结构,是一个数据的集合,集合中的数据组成了一个树状结构。例如上图,看起来像一棵倒挂的树,根朝上叶朝下。 树是由n(n>...
      99+
      2022-11-12
    • 数据库设计之概念结构设计
      概念结构设计是数据库设计的第一个阶段,它是在逻辑层面上对数据库进行建模和设计的过程。概念结构设计主要包括以下内容:1. 实体-关系模...
      99+
      2023-09-15
      数据库
    • C语言顺序表的概念及结构是什么
      这篇文章主要介绍“C语言顺序表的概念及结构是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言顺序表的概念及结构是什么”文章能帮助大家解决问题。1.顺序表的概念及结构顺序表是使用一段连续物理地...
      99+
      2023-06-30
    • C语言数据结构系列之树的概念结构和常见表示方法
      0x00 树的概念 树是一种非线性的数据结构,它是由 n(n >= 0)个有限节点组成的一个具有层次关系的集合。 ❓ 那么为什么叫 "树" 呢...
      99+
      2022-11-13
    • HTML基本结构的概念是什么
      这篇文章主要介绍了HTML基本结构的概念是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇HTML基本结构的概念是什么文章都会有所收获,下面我们一起来看看吧。 <!-...
      99+
      2022-10-19
    • C语言数据结构之堆排序详解
      目录1.堆的概念及结构2.堆的实现2.1 堆的向下调整算法2.2 堆的向上调整算法2.3 建堆(数组)2.4 堆排序2.5 堆排序的时间复杂度1.堆的概念及结构 如果有一个关键码的集...
      99+
      2022-11-13
    • C语言数据结构之堆、堆排序的分析及实现
      目录 1.堆的概念结构及分类1.2堆的分类1.2.1 大堆1.2.2 小堆2. 堆的主要接口3.堆的实现3.1 堆的初始化 HeapInit3.2 堆的销毁 HeapDes...
      99+
      2022-11-13
    • 数据结构与算法之了解基本概念
      本篇内容主要讲解“数据结构与算法之了解基本概念”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“数据结构与算法之了解基本概念”吧!前言数据结构与算法是程序员内功体现...
      99+
      2022-10-19
    • Java数据结构链表的概念是什么与怎么实现
      本文小编为大家详细介绍“Java数据结构链表的概念是什么与怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java数据结构链表的概念是什么与怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、什么是...
      99+
      2023-06-29
    • C#的概念是什么
      本文小编为大家详细介绍“C#的概念是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#的概念是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。C#简介    &nb...
      99+
      2023-06-27
    • 数据结构之堆的具体使用
      目录堆的概念及结构定义堆堆的初始化插入数据判空删除堆顶的数据获取堆顶数据获取元素个数打印销毁堆Topk问题代码总结堆的概念及结构 定义堆 实现堆的功能首先要定义堆的结构体 typ...
      99+
      2022-11-13
    • Java数据结构之图的基础概念和数据模型详解
      目录图的实际应用图的定义及分类图的相关术语图的存储结构邻接矩阵邻接表图的实现图的API设计代码实现图的实际应用 在现实生活中,有许多应用场景会包含很多点以及点点之间的连接,而这些应用...
      99+
      2022-11-13
      Java数据结构 图 Java 图
    • C语言 深入解读数据结构之堆的实现
      堆的概念与结构 概念:如果有一个关键码的集合K={ k0,k1 ,k2 ,…,kn-1 },把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中,并满足K i<=K ...
      99+
      2022-11-12
    • C语言数据结构之堆排序的优化算法
      目录1.堆排序优化算法1.1建堆的时间复杂度1.1.1 向下调整建堆:O(N)1.1.2 向上调整建堆:O(N*logN)1.2堆排序的复杂度1.2.1原堆排序的时间复杂度...
      99+
      2022-11-13
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作