博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
优先队列(堆)
阅读量:4560 次
发布时间:2019-06-08

本文共 2136 字,大约阅读时间需要 7 分钟。

在打印机作业时一般采用队列的形式FIFO(fisrt in first out),但遇到一个1份的和一个100份的作业时,先打印1份的相对合理;另外,不同作业的优先级也不同,优先级高的应该先处理。

 insert == Enqueue

deleteMin == Dequeue

二叉堆(完全二叉树):除了底层,一棵被完全填满的二叉树,底层上元素从左到右填入。

完全二叉树很有规律,可用数组表示:对于任一节点元素X,其父节点元素H->element[i/2],其左儿子H->element[2i],右儿子H->element[2i+1]。

  A B C D E F G H I  J  

0 1 2 3 4 5 6 7 8 9 10 11 12 13 

一个堆的数据结构:一个数组、容量、当前堆大小。

注意事项:

 

节点声明:

struct heap{       int           capacity;       int           size;       elementType   *elements;}

堆序性:节点X的关键字 大于等于  节点X父亲节点的关键字。

priority queue creat:

priorityQueue *initialize( int maxElement){       priotityQueue *H;       if (maxElement < minPQSize)       {             cout << "priorityQueue is too small" << endl;             return NULL;       }        H->elements = New element[maxElement + 1];       if(H->elements == NULL)       {             cout << "out of space" << endl;             return NULL;       }       H->capacity = maxElement;       H->size = 0;
//minData为足够小的数,保证元素插入后最多上滤到i=1处,即根节点。
H->elements[0] = minData;        return H; }

 insert:(末端插入)

void insert (elementType X , PriotityQueue *H){       if (isFull (H))       {           cout<< "out of space" << endl;           return;       }
// H->elements[0]是一个足够小的数minData,保证X
for(int i = ++H->size; X < H->elements[i/2]; i/=2)            H->elements[i] = H->elements[i/2];        H->elements[i] = X; }

 deleteMin(根处删除)

elementType deleteMin(priorityQueue *H){       int child;       elementType minElement , lastElement;       if(isEmpty(H))       {             cout << "priotityQueue is empty" << endl;             return H->elements[0];       }       minElement = H->elements[1];       lastElement = H->elements[H->size--];//保存最后一个元素,size-1                 for( int i = 1; 2*i <= H->size; i = child)       {             child = 2*i;             if(child != H->size && H->element[child + 1] < H->element[child])                child++;             if(H->element[child]
element[i] = H->element[child]; //由二叉堆的堆序性可知min堆的节点X < 其儿子节点 else break; } H->elements[i] = lastElement; return minElement;}

 

转载于:https://www.cnblogs.com/Lunais/p/5579092.html

你可能感兴趣的文章
【2019-08-20】有点目标,有点计划,有点目的
查看>>
【2019-09-10】美,真的跟年龄无关
查看>>
【2019-09-28】少,但更好
查看>>
【2019-09-13】耐心观察是一种技能
查看>>
mysql数据库2-常用命令
查看>>
安卓开发环境搭建(转)
查看>>
英语学习一周年
查看>>
set容器
查看>>
python基础学习目录
查看>>
微软必应地图加载错误:Uncaught TypeError: Microsoft.Maps.Location is not a constructor
查看>>
卷积神经网络是如何工作的(译文)
查看>>
微信开发 笔记1
查看>>
SQL server 删除日志文件 秒删
查看>>
MethodChannel 实现flutter 与 原生通信
查看>>
lua的性能优化
查看>>
vs2012 出现断点无法命中 解决方案。
查看>>
weex图片加载更多方法loadmore的使用
查看>>
创建您的 ActiveReports Web端在线报表设计器
查看>>
项目复审
查看>>
FreeMarker学习
查看>>