二叉堆(binary heap)—— 优先队列的实现
二叉堆因为对应着一棵完全二叉树,因而可以通过线性数组的方式实现。
注意,数组第 0 个位置上的元素,作为根,还是第 1 个位置上的元素作为根?
- 本文给出的实现,以数组第 1 个位置上的元素作为根,则其两个孩子 ⇒ 2*i, 2*i+1
- 而第 0 个位置上的元素,则用来作为标志变量(Size 不包括此变量);
在元素逐个插入的过程中(插入在合适的位置),实现二叉堆的构建;自然删除也需按着指定的规则;
1. 声明
struct HeapStruct;
typedef struct HeapStruct* PriorityQueue;
PriorityQueue Init(int MaxElements);
...
void Insert(ElementType X, PriorityQueue PQ);
ElementType DeleteMin(PriorityQueue PQ);
2. 实现
struct HeapStruct {
int Capacity;
int Size;
ElementType* Elements;
};
PriorityQueue Init(int MaxElements){
PriorityQueue PQ;
PQ = (PriorityQueue)malloc(sizeof(struct HeapStruct));
if (!PQ) ....
PQ->Elements = (ElementType)malloc(MaxElements*sizeof(ElementType));
if (!PQ) ...
PQ->Capacity = MaxElements;
PQ-Size = 0;
PQ->Elements[0] = INT_MIN;
}
void Insert(ElementType X, PriorityQueue PQ) {
if (IsFull(PQ)) ...
for (int i = ++PQ->Size; PQ->Elements[i/2] > X; i /= 2) {
PQ->Elements[i] = PQ->Elements[i/2];
}
PQ->Elements[i] = X;
}
比较困难的是删除时,二叉堆结构在线性数组上的维持:
ElementType DeleteMin(PriorityQueue PQ) {
if (IsEmpty(PQ)) ...
ElementType MinElement, LastElement;
MinElement = PQ->Elements[1];
LastElement = PQ->Elements[PQ->Size--];
int Child;
for (int i = 1; i*2 <= PQ->Size; ++i) {
Child = 2*i;
if (Child != PQ->Size && PQ->Elements[Child+1] < PQ->Elements[Child])
Child = Child + 1;
if (PQ->Elements[Child] < LastElement)
PQ->Element[i] = PQ->Elements[Child];
else
break;
}
PQ->Elements[i] = LastElement;
return MinElement;
}
二叉堆(binary heap)—— 优先队列的实现的更多相关文章
- 二叉堆(binary heap)
堆(heap) 亦被称为:优先队列(priority queue),是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因 ...
- python---使用二叉堆实现的优先队列(列表)
哟,有实用价值 可以看到,加入是随机的,而吐出是顺序的. # coding = utf-8 # 使用二叉堆实现的优先队列(列表) class BinaryHeap: def __init__(self ...
- 数据结构 之 二叉堆(Heap)
注:本节主要讨论最大堆(最小堆同理). 一.堆的概念 堆,又称二叉堆.同二叉查找树一样,堆也有两个性质,即结构性和堆序性. 1.结构性质: 堆是一棵被完全填满的二叉树,有可能的 ...
- 【数据结构与算法Python版学习笔记】树——利用二叉堆实现优先级队列
概念 队列有一个重要的变体,叫作优先级队列. 和队列一样,优先级队列从头部移除元素,不过元素的逻辑顺序是由优先级决定的. 优先级最高的元素在最前,优先级最低的元素在最后. 实现优先级队列的经典方法是使 ...
- Python实现二叉堆
Python实现二叉堆 二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全二元树(二叉树).二叉堆有两种:最大堆和最小堆.最大堆:父结点的键值总是大于或等于任何一个子节点的键值:最小堆: ...
- 堆(Heap)和二叉堆(Binary heap)
堆(Heap) The operations commonly performed with a heap are: create-heap: create an empty heap heapify ...
- Binary Heap(二叉堆) - 堆排序
这篇的主题主要是Heapsort(堆排序),下一篇ADT数据结构随笔再谈谈 - 优先队列(堆). 首先,我们先来了解一点与堆相关的东西.堆可以实现优先队列(Priority Queue),看到队列,我 ...
- 图论——Dijkstra+prim算法涉及到的优先队列(二叉堆)
[0]README 0.1)为什么有这篇文章?因为 Dijkstra算法的优先队列实现 涉及到了一种新的数据结构,即优先队列(二叉堆)的操作需要更改以适应这种新的数据结构,我们暂且吧它定义为Dista ...
- 【425】堆排序方法(二叉堆)优先队列(PQ)
参考:漫画:什么是二叉堆? 大根堆 小根堆 参考:漫画:什么是堆排序? 参考:漫画:什么是优先队列? 参考:[video]视频--第14周10--第8章排序10--8.4选择排序3--堆排序2--堆调 ...
随机推荐
- Python中的文本(一)
本文主要记录和总结本人在阅读<Python标准库>一书,文本这一章节的学习和理解. 事实上在Python中,使用文本这种一些方法是特别经常使用的一件事.在一般的情况下,都会使用String ...
- java 编程思想-java运算符--曾经不太明确的
1.java 运算符 主要是逻辑运算符和按位运算符;移位运算符-name tecmint.txt 逻辑运算符:And(&&) ; OR(||);Not(!) 按位运算符:And(&am ...
- JSP语法基础(一)
一.JSP页面中的凝视 (1)HTML凝视 <!-- comment [ <%=expression %> ] --> 能在client显示的一种凝视,标记内的全部JSP脚本元 ...
- Playing with coroutines and Qt
你好!我最近想知道C ++中的协程的状态,我发现了几个实现.我决定选择一个用于我的实验.它简单易用,适用于Linux和Windows. 我的目标是试图找到一种方法来让代码异步运行,而不必等待信号触发插 ...
- python opencv3 —— 改变颜色空间(color space)
OpenCV: Changing Colorspaces 1. 查看 opencv 支持的颜色空间转换 opencv 中色彩空间转换由一些定义的全局的宏给出,使用如下的代码,将它们调出: >&g ...
- js面向对象的选项卡
前言: 选项卡在项目中经常用到,也经常写,今天在github突然看到一个面向对象的写法,值得收藏和学习. 本文内容摘自github上的 helloforrestworld/javascriptLab ...
- vue中的select框的值动态绑定
<--这两种写法效果一样--> 1: <select v-model="wxStatus"> <option label="已添加" ...
- Microsoft iSCSI Software Target 快照管理
Microsoft iSCSI Software Target 支持快照管理,可以对设备进行手工创建快照.快照任务计划.快照回滚等操作. 首先配置iscsi 目标及设备映射关系,并在客户端通过发起程序 ...
- thinkphp3.1课程 1-1 为什么thinkphp在开发好后需要关掉开发模式
thinkphp3.1课程 1-1 为什么thinkphp在开发好后需要关掉开发模式 一.总结 一句话总结:因为调试模式中会记录你所有的调试信息,比如a调用b,b调用c,c调用d,比如你从哪个数据库取 ...
- ZOJ-1649 Rescue BFS (HDU 1242)
看题传送门: ZOJ http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1649 HDU http://acm.hdu.edu. ...