最大堆MaxHeap和最小堆MinHeap的实现(转)
队列的特点是先进先出。通常都把队列比喻成排队买东西,大家都很守秩序,先排队的人就先买东西。
但是优先队列有所不同,它不遵循先进先出的规则,而是根据队列中元素的优先权,优先权最大的先被取出。通常把优先队列比喻成现实生活中的打印。一个打印店里有很多打印机,每台机器的性能不一样,有的打印机打印很快,有的打印机打印速度很慢。当这些打印机陆陆续续打印完自己的任务时进入排队等候状态。如果我这个时候要打印一份文件,我选的不是第一个排队的打印机,而是性能最好,打印最快的打印机。
优先队列的特点就是将存储的元素根据其优先权的高低,先取出优先权高的元素。所以,优先队列的实现方法有很多。
如果优先权的范围是已知的,那么就可以尝试用一个二维数组来实现优先队列。每一行表示一个优先级别。例如用大小为a[10][10]的二维数组来实现一个优先队列,a[0]表示一个优先级别,里面存放优先级为0的元素,a[10]则存放优先级最高的元素。这样根据元素的优先级进行存储,取出元素的时候,根据优先级,先取出优先级最高的元素。
上面的方法在优先权范围已知且比较集中可以估计的情况下可以适用,但是如果优先权的范围不清楚,或者间隔很大,就不再使用。实现优先队列也可以用一个链表队列加以实现。链表的节点数据包含两个部分,队列的数据项和该数据项的优先权。将元素存入链表,需要用时,遍历链表,查找优先权最大的数据项。
优先队列式分支界限法解装载问题中需要用到最大堆MazHeap,但是书上没有给出代码,所以只能我们自己写了,下面我贴出这两个数据结构的代码,以供参考。解决了这两个数据结构,那么优先队列式分支界限法就很好实现了。
最大堆MaxHeap:
- #include<iostream>
- using namespace std;
- typedef struct Heap
- {
- int capacity;
- int size;
- int *Elem;
- }Heap,*HeapQueue;
- #define MaxData 32767
- HeapQueue init(int maxElem)
- {
- HeapQueue H;
- H=(HeapQueue)malloc(sizeof(Heap));
- H->capacity=maxElem;
- H->size=0;
- H->Elem=(int *)malloc((maxElem+1)*sizeof(int));
- H->Elem[0]=MaxData;
- return H;
- }
- void InsertMax(int x,HeapQueue H)
- {
- int i;
- for(i=++H->size;H->Elem[i/2]<x;i/=2)
- H->Elem[i]=H->Elem[i/2];//此时i还没有进行i/2操作
- H->Elem[i]=x;
- }
- int DeleteMax(HeapQueue H)
- {
- int i,child;
- int MaxElem,LastElem; //存储最大元素和最后一个元素。
- MaxElem=H->Elem[1]; //堆是从第1号元素开始的。
- LastElem=H->Elem[ H->size-- ]; //这里自动让size减少了。
- for(i = 1 ; i * 2 <= H->size ; i = child)
- {
- child=i * 2;
- /*在节点有左右子树的时候,可能存在一个大一个小的情况,这时候我们就要找出最小的;
- 如果Child = H->Size则表明他没有右子树,这时候就没有必要比较了。
- */
- if(child != H->size && H->Elem[child+1]>H->Elem[child])
- child++;//找最大的子树
- // 与 H->Elem[i]=LastElem; 结合,将两个孩子和 lastElement 中较大的放入祖先节点
- if(LastElem < H->Elem[child])
- H->Elem[i]=H->Elem[child];
- }
- H->Elem[i]=LastElem;
- return MaxElem;
- }
- void MakeEmpty(HeapQueue H)
- {
- H->size=0;
- }
- int FindMax(HeapQueue H)
- {
- return H->Elem[1];
- }
- void DestoryH(HeapQueue H)
- {
- free(H->Elem);
- free(H);
- }
- int main()
- {
- HeapQueue H=init(4);
- int i;
- for(i=1;i<=3;i++)
- InsertMax(i,H);
- /*
- cout<<H->size<<endl;
- for(i=1;i<=3;i++)
- cout<<H->Elem[i]<<endl;
- */
- int a=DeleteMax(H);
- cout<<a<<endl;
- return 1;
- }
最小堆MinHeap:
- #include<iostream>
- using namespace std;
- typedef struct Heap
- {
- int capacity;
- int size;
- int *Elem;
- }Heap,*HeapQueue;
- #define MinData -32767
- HeapQueue init(int maxElem)
- {
- HeapQueue H;
- H=(HeapQueue)malloc(sizeof(Heap));
- H->capacity=maxElem;
- H->size=0;
- H->Elem=(int *)malloc((maxElem+1)*sizeof(int));
- H->Elem[0]=MinData;
- return H;
- }
- void Insert(int x,HeapQueue H)
- {
- int i;
- for(i=++H->size;H->Elem[i/2]>x;i/=2)
- H->Elem[i]=H->Elem[i/2];//此时i还没有进行i/2操作
- H->Elem[i]=x;
- }
- int DeleteMin(HeapQueue H)
- {
- int i,child;
- int MinElem,LastElem;
- MinElem=H->Elem[1];//堆是从第1号元素开始的。
- LastElem=H->Elem[H->size--];//这里自动让size减少了。
- for(i = 1 ; i * 2 <= H->size ; i = child)
- {
- child=i * 2;
- /*在节点有左右子树的时候,可能存在一个大一个小的情况,这时候我们就要找出最小的;
- 如果Child = H->Size则表明他没有右子树,这时候就没有必要比较了。
- */
- if(child != H->size && H->Elem[child+1]<H->Elem[child])
- child++;
- if(LastElem>H->Elem[child])
- H->Elem[i]=H->Elem[child];
- }
- H->Elem[i]=LastElem;
- return MinElem;
- }
- void MakeEmpty(HeapQueue H)
- {
- H->size=0;
- }
- int FindMin(HeapQueue H)
- {
- return H->Elem[1];
- }
- void DestoryH(HeapQueue H)
- {
- free(H->Elem);
- free(H);
- }
- int main()
- {
- /*
- HeapQueue H=init(4);
- int i;
- for(i=1;i<=4;i++)
- Insert(i,H);
- int a=DeleteMin(H);
- cout<<a;
- */
- }
本文参考了http://blog.csdn.net/xw13106209/article/details/4942331
最大堆MaxHeap和最小堆MinHeap的实现(转)相关推荐
- C语言实现最小堆minheap(附完整源码)
C语言实现最小堆minheap min_heap结构体 实现以下8个接口 最小堆minheap完整源码(定义,实现,main函数测试) min_heap结构体 typedef struct min_h ...
- 最小堆(MinHeap)
最小堆 假设某一集合将所有元素按完全二叉树的顺序结构存放在一维数组中,并且在二叉树中每个节点都小于或等于其子节点,则称这个集合为最小堆. 若用数组来存储一个完全二叉树,某个节点在数组的下标为i: 若i ...
- 最大堆最小堆的实现(C语言)
---------------- 该篇文章经提醒有一些错误,暂时没有时间修改,请勿参考. 该篇文章经提醒有一些错误,暂时没有时间修改,请勿参考. ---------------- 堆是特殊的队列,从堆 ...
- 最大堆、最小堆Java实现,解决TOP K问题
一.基础知识 1.1 什么是最大(小)堆 最大堆,最小堆类似,以下以最小堆为例进行讲解. 最小堆是满足以下条件的数据结构: 它是一棵完全二叉树 所有父节点的值小于或等于两个子节点的值 1.2 什么是完 ...
- Leetcode295 数据流中的中位数-最小堆和最大堆
题目 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如,[2,3,4] 的中位数是 3:[2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两 ...
- 2020 C++ priority_queue 最大堆与最小堆介绍
文章目录 1.问题描述 2.具体分析 3.其他方式 4.用最小堆解决问题 1.问题描述 通常在刷题的时候,会遇到最大堆.最小堆的问题,这个时候如果自己去实现一个也是OK的,但是通常时间不太够,那么如何 ...
- C++实现最大堆和最小堆
堆 堆数据结构是一种数组对象,它可以被视为一颗完全二叉树结构(或者也有可能是满二叉树) 最大堆: 任一结点的关键码均大于等于它的左右孩子的关键码,其中堆顶的元素最大.(任一路径中的元素升序排列) 最小 ...
- C++使用priority_queue 实现最大最小堆
参考资料:https://www.cnblogs.com/nirvana-phoenix/archive/2012/05/29/2524344.html 1.基本类型实现 #include <i ...
- 数据结构最小堆C++实现
1.最小堆的结构: 左右子女的元素均小于等于父节点的元素,叫最小堆:左右子女的元素均大于等于父节点的元素,叫最大堆. 2.最小堆的建立过程如下图所示: 所有节点从上往下,从左往右一次标号0,1,2,. ...
最新文章
- MVP遇到GMCT:不加入域更改密码有几种方法?
- 代码详解:最全面的卷积神经网络介绍,都在这里了
- QTP 中 通过 Test Setting 设置 function libraries 与 test 的关联
- 节省磁盘空间的新一代包管理工具PNPM
- 【报错笔记】使用MultipartFile 出现异常:java.lang.ClassNotFoundException: org.apache.commons.fileupload...
- 计算机的三个基本功能,操作系统的三个作用是什么
- bash ./php-memcache.sh,PHP+shell脚本操作Memcached和Apache Status的实例分享
- 分区未分配linux,在Linux下对未分配剩余空间分区
- Kylin设置JDBC配置greenplum数据源
- [转帖] bat方式遍历目录内的文件
- 无法安装数据库关系图支持对象的解决方法
- 【洛谷P5018 对称二叉树】
- 田洪川(天轰穿)老师谈.NET学习:将励志和教学结合起来
- deepin驱动精灵_Deepin 15.4.1 X64官方正式版(64位)
- 计算机网络 理解拥塞控制
- 【数据说·第十五期】如何对营业额数据进行分析,提升门店盈利能力?
- 魔术命令python_魔术命令_利用Python进行数据分析_红黑联盟读书频道
- 姜小白的Python日记Day7 文件的读写
- CMD命令行下如何切换路径
- c语言中数组名和数组名取地址理解