二叉堆(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];elsebreak;}PQ->Elements[i] = LastElement;return MinElement;
}
二叉堆(binary heap)—— 优先队列的实现相关推荐
- C++二叉堆binary heap (附完整源码)
二叉堆binary heap 二叉堆binary heap 算法的完整源码(定义,实现,main函数测试) 二叉堆binary heap 算法的完整源码(定义,实现,main函数测试) #includ ...
- 看动画学算法之:二叉堆Binary Heap
文章目录 简介 二叉堆的特性 二叉堆的作用 二叉堆的构建 获取二叉堆的最大值 二叉堆的插入 insert操作的时间复杂度 二叉堆的提取Max操作 extractMax的时间复杂度 创建二叉堆 简介 我 ...
- 二叉堆时间复杂度 php,二叉堆(Binary Heap)
二叉堆这个数据结构有点意思,自己做了个总结,内容结构如下: 二叉堆性质 二叉堆操作 应用 二叉堆性质: 堆(Heap)是一个可以被看成近似完全二叉树的结构,具有完全二叉树的特性: 缺少的叶子节点总是位 ...
- 二叉堆与自定义优先队列实现删除任意元素
二叉堆与自定义优先队列实现删除任意元素 堆Heap 二叉堆Binary Heap 二叉堆 二叉堆的实现 插入(insert) 取出堆顶(extract / delete max) 优先队列(Prior ...
- 利用二叉堆实现最小优先队列
利用二叉堆实现最小优先队列 package 第二章数据结构基础;import java.util.Arrays;public class 二叉堆和优先队列 {public static void ma ...
- python优先队列的库,python优先队列及二叉堆的实现
python优先队列及二叉堆的实现 发布于 2015-12-18 06:55:17 | 117 次阅读 | 评论: 0 | 来源: PHPERZ Python编程语言Python 是一种面向对象.解释 ...
- python最大堆_二叉堆 及 大根堆的python实现
Python 二叉堆(binary heap) 二叉堆是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树.二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子 ...
- 数据结构之优先队列--二叉堆(Java实现)
前言 数据结构队列的学习中,我们知道队列是先进先出的.任务被提交到队列中,按照先进先出的原则 对各个任务进行处理.不过在现实的情况下,任务通常有着优先级的概念,例如短任务.管理员的操作 应该优先执行. ...
- 优先队列与相关题目(Python、二叉堆)
1. 优先队列知识 1.1 优先队列简介 优先队列:一种特殊的队列.在优先队列中,元素被赋予优先级,当访问队列元素时,具有最高优先级的元素最先删除. 优先队列与普通队列最大的不同点在于出队顺序 普通队 ...
- 大顶堆删除最大值_算法学习笔记(47): 二叉堆
堆(Heap)是一类数据结构,它们拥有树状结构,且能够保证父节点比子节点大(或小).当根节点保存堆中最大值时,称为大根堆:反之,则称为小根堆. 二叉堆(Binary Heap)是最简单.常用的堆,是一 ...
最新文章
- 企业中的混乱:如何对云计算具有信心
- Glib 对 C 函数进行单元测试
- Linux进程编程(PS: exec族函数、system、popen函数)
- js 获得明天0点时间戳_js实现一个简单钟表动画(javascript+html5 canvas)
- Maya+3dsMax三维建模
- HTML - label (转)
- 拯救天使 (BFS)
- PMP-PMBOK(第六版)--49个过程ITTO记忆口诀(第一辑)
- 经纬度 度分秒 正则表达式
- WORD导出PDF生成书签
- QQ连连看外挂核心算法(检测两点能否连通)
- python现在版本强势英雄_当前版本中后期强势英雄排行榜,第一名后期无敌!
- T2695 桶哥的问题——吃桶
- 计算机知识小口诀,字根表口诀怎么快速背-小学数学:一年级20以内加减法口诀表,附背诵技巧!...
- 【无标题】三星Xpress M2020打印机刷免芯片
- 大疆校招和社招 各岗位内推码--更新20220717
- PWM、SPWM、SVPWM的个人理解
- 【仓库物资识别】二、将三维点云转换成二维图像
- Ubuntu下Firefox无法打开localhost:5560/isqlplus解决办法
- Ambient Occlusion 环境光遮蔽 后期处理系列4
热门文章
- 骨架屏 (Skeleton Screen)
- 计算机网络-自顶向下方法(7th) 第一章 Review Questions 中英对照
- java与android https,Java-Android SSL https发布
- Sklearn——Sklearn的介绍与安装
- Nvidia-Docker
- Qt总结之二十三:QByteArray与char、int、float(及其数组)之间的互相转化
- sqlserver没有ldf附加数据库
- 关于svn服务部署方案
- 遊戲是這樣寫成的 (第三篇: 簡單的遊戲框架)
- position小结