`

最大堆MaxHeap和最小堆MinHeap的实现(转)

 
阅读更多

       队列的特点是先进先出。通常都把队列比喻成排队买东西,大家都很守秩序,先排队的人就先买东西。

       但是优先队列有所不同,它不遵循先进先出的规则,而是根据队列中元素的优先权,优先权最大的先被取出。通常把优先队列比喻成现实生活中的打印。一个打印店里有很多打印机,每台机器的性能不一样,有的打印机打印很快,有的打印机打印速度很慢。当这些打印机陆陆续续打印完自己的任务时进入排队等候状态。如果我这个时候要打印一份文件,我选的不是第一个排队的打印机,而是性能最好,打印最快的打印机。

       优先队列的特点就是将存储的元素根据其优先权的高低,先取出优先权高的元素。所以,优先队列的实现方法有很多。

       如果优先权的范围是已知的,那么就可以尝试用一个二维数组来实现优先队列。每一行表示一个优先级别。例如用大小为a[10][10]的二维数组来实现一个优先队列,a[0]表示一个优先级别,里面存放优先级为0的元素,a[10]则存放优先级最高的元素。这样根据元素的优先级进行存储,取出元素的时候,根据优先级,先取出优先级最高的元素。

       上面的方法在优先权范围已知且比较集中可以估计的情况下可以适用,但是如果优先权的范围不清楚,或者间隔很大,就不再使用。实现优先队列也可以用一个链表队列加以实现。链表的节点数据包含两个部分,队列的数据项和该数据项的优先权。将元素存入链表,需要用时,遍历链表,查找优先权最大的数据项。

 

优先队列式分支界限法解装载问题中需要用到最大堆MazHeap,但是书上没有给出代码,所以只能我们自己写了,下面我贴出这两个数据结构的代码,以供参考。解决了这两个数据结构,那么优先队列式分支界限法就很好实现了。

最大堆MaxHeap:

 

  1. #include<iostream>  
  2. using namespace std;  
  3. typedef struct Heap  
  4. {  
  5.     int capacity;  
  6.     int size;  
  7.     int *Elem;  
  8. }Heap,*HeapQueue;  
  9. #define MaxData 32767  
  10. HeapQueue init(int maxElem)  
  11. {  
  12.     HeapQueue H;  
  13.     H=(HeapQueue)malloc(sizeof(Heap));  
  14.     H->capacity=maxElem;  
  15.     H->size=0;  
  16.     H->Elem=(int *)malloc((maxElem+1)*sizeof(int));  
  17.     H->Elem[0]=MaxData;  
  18.     return H;  
  19. }  
  20. void InsertMax(int x,HeapQueue H)  
  21. {  
  22.     int i;  
  23.     for(i=++H->size;H->Elem[i/2]<x;i/=2)  
  24.         H->Elem[i]=H->Elem[i/2];//此时i还没有进行i/2操作  
  25.     H->Elem[i]=x;  
  26. }  
  27. int DeleteMax(HeapQueue H)  
  28. {  
  29.     int i,child;  
  30.     int MaxElem,LastElem;           //存储最大元素和最后一个元素。  
  31.     MaxElem=H->Elem[1];              //堆是从第1号元素开始的。  
  32.     LastElem=H->Elem[ H->size-- ];    //这里自动让size减少了。  
  33.     for(i = 1 ; i * 2 <= H->size ; i = child)  
  34.     {  
  35.         child=i * 2;  
  36.         /*在节点有左右子树的时候,可能存在一个大一个小的情况,这时候我们就要找出最小的; 
  37.           如果Child = H->Size则表明他没有右子树,这时候就没有必要比较了。 
  38.         */  
  39.         if(child != H->size && H->Elem[child+1]>H->Elem[child])  
  40.             child++;//找最大的子树  
  41. // 与 H->Elem[i]=LastElem; 结合,将两个孩子和 lastElement 中较大的放入祖先节点
  42.         if(LastElem < H->Elem[child])  
  43.             H->Elem[i]=H->Elem[child];
  44.     }  
  45.     H->Elem[i]=LastElem;  
  46.     return MaxElem;  
  47. }  
  48. void MakeEmpty(HeapQueue H)  
  49. {  
  50.     H->size=0;  
  51. }  
  52. int FindMax(HeapQueue H)  
  53. {  
  54.     return H->Elem[1];  
  55. }  
  56. void DestoryH(HeapQueue H)  
  57. {  
  58.     free(H->Elem);  
  59.     free(H);  
  60. }  
  61. int main()  
  62. {  
  63.       
  64.     HeapQueue H=init(4);  
  65.     int i;  
  66.     for(i=1;i<=3;i++)  
  67.         InsertMax(i,H);  
  68. /* 
  69.     cout<<H->size<<endl; 
  70.     for(i=1;i<=3;i++) 
  71.         cout<<H->Elem[i]<<endl; 
  72. */  
  73.     int a=DeleteMax(H);  
  74.     cout<<a<<endl;  
  75.     return 1;  
  76. }  

 

 

最小堆MinHeap:

 

[c-sharp] view plaincopy
  1. #include<iostream>  
  2. using namespace std;  
  3. typedef struct Heap  
  4. {  
  5.     int capacity;  
  6.     int size;  
  7.     int *Elem;  
  8. }Heap,*HeapQueue;  
  9. #define MinData -32767  
  10. HeapQueue init(int maxElem)  
  11. {  
  12.     HeapQueue H;  
  13.     H=(HeapQueue)malloc(sizeof(Heap));  
  14.     H->capacity=maxElem;  
  15.     H->size=0;  
  16.     H->Elem=(int *)malloc((maxElem+1)*sizeof(int));  
  17.     H->Elem[0]=MinData;  
  18.     return H;  
  19. }  
  20. void Insert(int x,HeapQueue H)  
  21. {  
  22.     int i;  
  23.     for(i=++H->size;H->Elem[i/2]>x;i/=2)  
  24.         H->Elem[i]=H->Elem[i/2];//此时i还没有进行i/2操作  
  25.     H->Elem[i]=x;  
  26. }  
  27. int DeleteMin(HeapQueue H)  
  28. {  
  29.     int i,child;  
  30.     int MinElem,LastElem;  
  31.     MinElem=H->Elem[1];//堆是从第1号元素开始的。  
  32.     LastElem=H->Elem[H->size--];//这里自动让size减少了。  
  33.     for(i = 1 ; i * 2 <= H->size ; i = child)  
  34.     {  
  35.         child=i * 2;  
  36.         /*在节点有左右子树的时候,可能存在一个大一个小的情况,这时候我们就要找出最小的; 
  37.           如果Child = H->Size则表明他没有右子树,这时候就没有必要比较了。 
  38.         */  
  39.         if(child != H->size && H->Elem[child+1]<H->Elem[child])  
  40.             child++;  
  41.         if(LastElem>H->Elem[child])  
  42.             H->Elem[i]=H->Elem[child];  
  43.     }  
  44.     H->Elem[i]=LastElem;  
  45.     return MinElem;  
  46. }  
  47. void MakeEmpty(HeapQueue H)  
  48. {  
  49.     H->size=0;  
  50. }  
  51. int FindMin(HeapQueue H)  
  52. {  
  53.     return H->Elem[1];  
  54. }  
  55. void DestoryH(HeapQueue H)  
  56. {  
  57.     free(H->Elem);  
  58.     free(H);  
  59. }  
  60. int main()  
  61. {  
  62.     /* 
  63.     HeapQueue H=init(4); 
  64.     int i; 
  65.     for(i=1;i<=4;i++) 
  66.         Insert(i,H); 
  67.     int a=DeleteMin(H); 
  68.     cout<<a; 
  69.     */  
  70. }  

 

 

 

本文参考了http://blog.csdn.net/xw13106209/article/details/4942331

 

分享到:
评论

相关推荐

    heap:Java中的MinMax堆和堆排序实现

    最小/最大堆数据结构和堆排序算法的完整javascript实现。 最小堆 最大堆 目录 。叶子() 。尺寸() 。克隆() 。已验证() 。使固定() 。种类() 。清除() Heap.heapify(清单) Heap....

    双堆的插入与删除C++

    双堆是一种特殊的数据结构,它结合了最大堆和最小堆的特性,可以在两端进行高效的插入和删除操作。在C++中实现双堆,通常需要利用STL中的`priority_queue`容器,或者自定义数据结构来达到目的。下面将详细介绍双堆的...

    找海量数据的前N大(小)元素的C++模板实现

    接下来,我们将介绍如何用C++实现最大堆和最小堆。以`MaxHeap.hpp`为例,它可能包含以下内容: ```cpp class MaxHeap { public: MaxHeap(int capacity); void insert(int val); int extractMax(); bool isEmpty...

    堆的插入删除操作C++

    在计算机科学中,堆可以分为两种主要类型:最大堆(Max-Heap)和最小堆(Min-Heap)。最大堆中,每个父节点的值都大于或等于其子节点的值;而在最小堆中,每个父节点的值都小于或等于其子节点的值。本篇文章将深入...

    华为OD机试C卷- 最大N个数与最小N个数的和(Java & JS & Python).md-私信看全套OD代码及解析

    3. **寻找最大和最小 N 个数**:利用优先队列(最小堆和最大堆)来高效地找到最大和最小 N 个数。 4. **检查重叠**:确保最大N个数和最小N个数没有重叠,若有重叠则返回 -1。 5. **计算和输出结果**:计算两个集合的...

    数据结构代码

    在本压缩包“Data-Structure-master”中,包含的是使用C++语言实现的数据结构相关的代码,主要涉及树结构、队列、堆栈以及排序算法,特别是MaxHeap(最大堆)和MinHeap(最小堆)。下面将详细解释这些知识点。 1. *...

    堆:这是带有堆排序的最小和最大堆

    priority_queue&lt;int&gt; maxHeap; ``` 4. 堆排序算法: 堆排序是一种原地排序算法,它利用了堆的特性。主要步骤包括: - 构建初始堆:将无序数组构建成一个最大堆或最小堆。 - 堆顶元素与末尾元素交换:将堆顶...

    HeapKit:Heap 数据结构的 Swift 实现

    1. **最大堆与最小堆**:HeapKit 支持两种类型的堆,最大堆(MaxHeap)和最小堆(MinHeap)。最大堆保证根节点是所有节点中最大的,而最小堆则保证根节点是最小的。 2. **插入操作**:`insert` 函数允许将一个...

    Dheap:D堆数据结构的实现

    在Java中实现D堆时,我们可以定义一个DHeap类,包含两个PriorityQueue成员变量,分别表示最大堆和最小堆。以下是一个简单的DHeap类的概览: ```java public class DHeap { private PriorityQueue&lt;Integer&gt; maxHeap...

    数据结构英文教学课件:24_sorting_03.pdf

    根据这种关系,堆有两种变体:最小堆(MinHeap)和最大堆(MaxHeap)。在最小堆中,父节点的键值不大于其子节点的键值,而在最大堆中则相反,父节点的键值不小于其子节点的键值。但节点与其兄弟节点之间并无特定的...

    优先队列及其应用PPT学习教案.pptx

    2. 最小堆(MinHeap)和最大堆(MaxHeap):位于堆顶的节点的值是整个序列中最小(大)的。 应用实例: 1. 机器服务收费:根据用户所需服务时间对其进行排序,以便快速处理高优先级的用户。 2. 工厂仿真:根据机器...

    基于C++模板 实现的数据结构代码.zip

    - 堆:如最小堆`MinHeap&lt;T&gt;`和最大堆`MaxHeap&lt;T&gt;`,用于优先级队列等用途。 - 树结构:可能包括二叉搜索树`BinarySearchTree&lt;T&gt;`、AVL树、红黑树等,支持查找、插入、删除等操作。 6. **C++标准库中的模板**: -...

    【算法题】数据流中的中位数

    具体实现中,我们通常定义一个类`Solution`,包含两个成员变量:`count`用于记录数据流中元素的总数,以及两个优先级队列`minHeap`和`maxHeap`。在插入元素时,我们需要根据总数`count`的奇偶性来决定将新元素放入...

    课程设计2

    堆是一种能够快速访问最大或最小元素的数据结构,这里我们使用两个堆,一个大顶堆(MaxHeap)和一个小顶堆(MinHeap)。 大顶堆保存比小顶堆堆顶小的元素,且大顶堆元素数量最多比小顶堆多1。插入新数时,如果新数...

    数据结构各种算法的c++实现

    - **操作实现**:通常使用堆(如最小堆或最大堆)来实现高效插入和删除操作。 **代码示例**: ```cpp template, typename Compare&gt; class PriorityQueue { public: PriorityQueue() {} ~PriorityQueue(); bool ...

    PriorityQueue:基于二进制堆的PriorityQueue实现

    PriorityQueue 优先队列实现C# PriorityQueueLib: 基于二进制堆的最小/最大优先级队列实现PriorityQueueTests: PriorityQueue单元测试

    NetCollections:C#中的数据结构实现

    PriorityLookupQueue:基于二进制堆的最小/最大优先级队列实现,具有快速查找 BinarySearchTree:自平衡AVL二进制搜索树 NetCollectionsTests库: PriorityQueue单元测试 PriorityLookupQueue单元测试 ...

    datastructures-js:javascript中可用于生产的数据结构实现

    renamed to avoid conflict with es6 Set LinkedList , LinkedListNode , DoublyLinkedList , DoublyLinkedListNode , MinHeap , MaxHeap , MinPriorityQueue , MaxPriorityQueue , BinarySearchTree , Bi

Global site tag (gtag.js) - Google Analytics