二叉堆的BuildHeap操作
优先队列(二叉堆)BuildHeap操作
\(BuildHeap(H)\)操作把\(N\)个关键字作为输入并把它们放入空堆中。显然,这可以使用\(N\)个相继的\(Insert\)操作来完成。由于每个\(Insert\)将花费\(O(1)\)平均时间以及\(O(\log N)\)的最坏情形时间,因此该算法的总的运行时间则是\(O(N)\)的平均时间而不是\(O(N \log N)\)最坏情形时间。
一般的算法是将\(N\)个关键字以任意顺序放入树中,保持 结构性 。此时,如果\(PercolateDown(i)\)从节点\(i\)下滤,那么执行下代码中的算法创建一颗具有堆序的树(\(heap-ordered-tree\))。
二叉堆有两个性质:结构性质和堆序性质。
for(i = N / 2; i > 0; i--)
PercolateDown(i);
定理
包含\(2^{b+1}-1\)个节点高为\(b\)的理想二叉树(perfect binary tree)(也叫完全二叉树)的节点的高度的和为\(2^{b+1}-1-(b+1)\) 。
代码
PriorityQueue BuildHeap(ElementType *Elements, int N)
{
int i;
PriorityQueue H;
H = Initialize(N);
for (i = 1; i <= N; i++)
H->Elements[i] = Elements[i - 1];
H->Size = N;
for (i = N / 2; i > 0; i--)
PercolateDown(i, H);
return H;
}
void PercolateDown(int i, PriorityQueue H)
{
int MinSon, Min;
ElementType Tmp;
if (i <= H->Size / 2)
{
MinSon = i * 2 + 1 <= H->Size && H->Elements[i * 2] > H->Elements[i * 2 + 1] ? i * 2 + 1 : i * 2;
Min = H->Elements[i] < H->Elements[MinSon] ? i : MinSon;
Tmp = H->Elements[i];
H->Elements[i] = H->Elements[MinSon];
H->Elements[MinSon] = Tmp;
PercolateDown(MinSon, H);
}
}
另一种线性时间实现方法
把每个元素当作是单节点左式堆,把所有这些堆放到一个队列中。之后,让两个堆出队,合并它们,再将合并结果入队,直到队列中只有一个堆为止。
该算法在最坏情形下为\(O(N)\)。
此方法生成的堆更“左”。
二叉堆的BuildHeap操作的更多相关文章
- 【数据结构与算法Python版学习笔记】树——利用二叉堆实现优先级队列
概念 队列有一个重要的变体,叫作优先级队列. 和队列一样,优先级队列从头部移除元素,不过元素的逻辑顺序是由优先级决定的. 优先级最高的元素在最前,优先级最低的元素在最后. 实现优先级队列的经典方法是使 ...
- 图论——Dijkstra+prim算法涉及到的优先队列(二叉堆)
[0]README 0.1)为什么有这篇文章?因为 Dijkstra算法的优先队列实现 涉及到了一种新的数据结构,即优先队列(二叉堆)的操作需要更改以适应这种新的数据结构,我们暂且吧它定义为Dista ...
- 二叉堆的介绍和Java实现
一.堆和二叉堆 堆,英文名称Heap,所谓二叉堆(也有直接称二叉堆为堆的),本质上是一个完全二叉树,前面也提到过,如果树接近于完全二叉树或者满二叉树,采用顺序存储代价会小一点,因此常见的二叉堆均是顺序 ...
- D&F学数据结构系列——二叉堆
二叉堆(binary heap) 二叉堆数据结构是一种数组对象,它可以被视为一棵完全二叉树.同二叉查找树一样,堆也有两个性质,即结构性和堆序性.对于数组中任意位置i上的元素,其左儿子在位置2i上,右儿 ...
- 数据结构 之 二叉堆(Heap)
注:本节主要讨论最大堆(最小堆同理). 一.堆的概念 堆,又称二叉堆.同二叉查找树一样,堆也有两个性质,即结构性和堆序性. 1.结构性质: 堆是一棵被完全填满的二叉树,有可能的 ...
- 数据结构与算法——优先队列类的C++实现(二叉堆)
优先队列简单介绍: 操作系统表明上看着是支持多个应用程序同一时候执行.其实是每一个时刻仅仅能有一个进程执行,操作系统会调度不同的进程去执行. 每一个进程都仅仅能执行一个固定的时间,当超过了该时间.操作 ...
- 2977,3110 二叉堆练习1,3——codevs
二叉堆练习1 题目描述 Description 已知一个二叉树,判断它是否为二叉堆(小根堆) 输入描述 Input Description 二叉树的节点数N和N个节点(按层输入) 输出描述 Outpu ...
- Python实现二叉堆
Python实现二叉堆 二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全二元树(二叉树).二叉堆有两种:最大堆和最小堆.最大堆:父结点的键值总是大于或等于任何一个子节点的键值:最小堆: ...
- 数据结构图文解析之:二叉堆详解及C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
随机推荐
- skip-list(跳表)原理及C++代码实现
跳表是一个很有意思的数据结构,它实现简单,但是性能又可以和平衡二叉搜索树差不多. 据MIT公开课上教授的讲解,它的想法和纽约地铁有异曲同工之妙,简而言之就是不断地增加“快线”,从而降低时间复杂度. 当 ...
- selenium登录网银,密码控件输入
尝试登录农行网银,发现带控件的密码输入框怎么都无法输入啊 最后用虚拟键盘实现的 , DD模拟键盘 http://www.ddxoft.com/ 图形验证码识别没过,有时间再继续 需要安装 Tess ...
- descriptive statistics|inferential statistics|Observational Studies| Designed Experiments
descriptive statistics:组织和总结信息,为自身(可以是population也可以是sample)审视和探索, inferential statistics.从sample中推论p ...
- King of the Waves
You are organising a king of the hill tournament, the Buenos Aires Paddleboarding Competition (BAPC) ...
- cesium初探之加载三维模型
项目需要用到二三维地图切换,本来准备研究ArcGIS js for Web 3d,但考虑到版权的问题,决定试着用cesium来做,于是花了2天时间抱着试试看的心态把cesium从环境配置到加载三维模型 ...
- UML Learning
在建筑业中,建模是一项经过检验并被广泛接受的工程技术,建立房屋和大厦的建筑模型,能帮助用户得到实际建筑物的印象.在软件建模中也具有同样的作用,建模提供了系统的蓝图. 建模是为了能够更好地理解正在开发的 ...
- selenium中quit与close方法的区别
https://blog.csdn.net/lbxoqy/article/details/71981222
- String的compareTo用法
String的compareTo其实就是依次比较两个字符串ASC码.如果两个字符的ASC码相等则继续后续比较,否则直接返回两个ASC的差值.如果两个字符串完全一样,则返回0.来看一下代码. publi ...
- [LC] 14. Longest Common Prefix
Write a function to find the longest common prefix string amongst an array of strings. If there is n ...
- UFT安装
1.下载解压双击setup.exe 2.点击安装 3.点击下一步 4.检测是否需要安装插件之后一路向下 5.安装之后图标 下载: 链接:https://pan.baidu.com/s/1sa0h037 ...