建堆是 O(n) 的时间复杂度证明。
建堆的复杂度先考虑满二叉树,和计算完全二叉树的建堆复杂度一样。
对满二叉树而言,第 \(i\) 层(根为第 \(0\) 层)有 \(2^i\) 个节点。
由于建堆过程自底向上,以交换作为主要操作,因此第 \(i\) 层任意节点在最不利情况下,
需要经过 \((n - i)\) 次交换操作才能完成以该节点为堆根节点的建堆过程。
因此,时间复杂度计算如下:
\(T(n) = 2^0 * (n - 0) + 2^1 * (n - 1) + ... + 2^n * (n - n) = \sum_{i = 0}^{n}(2^i * (n - i))\)
将上式乘以 \(2\)得:
\(2*T(n) = 2^1 * (n - 0) + 2^2 * (n - 1) + ... + 2^{n+1} * (n - n) = \sum_{i = 1}^{n+1}(2^i * (n - i))\)
原式减去上式得:
\(2T(n) - T(n) = -n + 2^1 + 2^2 + ... + 2^n = 2 * \frac{1 - 2^n} {1 - 2} - n = 2^{n+1} - 2 - n\).
上面推导中,\(n\) 为层数编号(自 \(0\) 层根节点开始)。
故总节点数为 \((1 + 2 + 4 + ... + 2^n) = 2^{n+1} - 1\)。
渐进时,忽略减 \(1\) 取 \(N = 2^{n+1}\) 。
所以,\(T(N) = 2^{n+1} - n - 2 = N * (1 - \frac{logN} { N} - \frac{2} {N}) ≈ N\).
所以,建堆的时间复杂度为 \(O(N)\) ,得证。\(N\)为总节点数。
建堆是 O(n) 的时间复杂度证明。的更多相关文章
- 建堆复杂度O(n)证明
堆排序中首先需要做的就是建堆,广为人知的是建堆复杂度才O(n),它的证明过程涉及到高等数学中的级数或者概率论,不过证明整体来讲是比较易懂的. 堆排过程 代码如下 void print(vector&l ...
- Python3实现最小堆建堆算法
今天看Python CookBook中关于“求list中最大(最小)的N个元素”的内容,介绍了直接使用python的heapq模块的nlargest和nsmallest函数的解决方式,记得学习数据结构 ...
- 堆+建堆、插入、删除、排序+java实现
package testpackage; import java.util.Arrays; public class Heap { //建立大顶堆 public static void buildMa ...
- 一些求和式的估算 & 杜教筛时间复杂度证明
本文内容概要: \(A=\sum\limits_{i=1}^n\dfrac1{\sqrt i}=1+\dfrac1{\sqrt2}+\cdots+\dfrac1{\sqrt n}\) \(O(\sqr ...
- luogu P4183 Cow at Large P (暴力吊打点分治)(内有时间复杂度证明)
题面 贝茜被农民们逼进了一个偏僻的农场.农场可视为一棵有N个结点的树,结点分别编号为 1,2,-,N .每个叶子结点都是出入口.开始时,每个出入口都可以放一个农民(也可以不放).每个时刻,贝茜和农民都 ...
- 第十章 优先级队列 (b4)完全二叉堆:批量建堆
- 自己动手实现java数据结构(八) 优先级队列
1.优先级队列介绍 1.1 优先级队列 有时在调度任务时,我们会想要先处理优先级更高的任务.例如,对于同一个柜台,在决定队列中下一个服务的用户时,总是倾向于优先服务VIP用户,而让普通用户等待,即使普 ...
- go实现堆排序、快速排序、桶排序算法
一. 堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法.以大堆为例利用堆顶记录的是最大关键字这一特性,每一轮取堆顶元素放入有序区,就类似选择排序每一轮选择一个最大值放入有序区,可以把堆排序看成是 ...
- 堆排序中建堆过程时间复杂度O(n)怎么来的?
首先这个循环是从i = headsize/2 -> 1,也就是说这是一个bottom-up的建堆.于是,有1/2的元素向下比较了一次,有1/4的向下比较了两次,1/8的,向下比较了3次,.... ...
随机推荐
- gcc 生成动态链接库
http://blog.csdn.net/ngvjai/article/details/8520840 Linux下文件的类型是不依赖于其后缀名的,但一般来讲: .o,是目标文件,相当于windows ...
- ArcGIS api for javascript——加载图标
描述 这个示例展示了如何能用一个动画图片显示地图正在加载.在这个示例中,图片是一个小的动画GIF.当地图第一次加载或用户缩放和平移地图时显示图片.当所有图层加载完成图片消失. 这个示例是通过event ...
- [Python] Array Attributes of Numpy lib
Attributes of numpy.ndarray: numpy.ndarray.shape: Dimensions (height, width, ...) numpy.ndarray.ndim ...
- C#文件拖放至窗口的ListView控件获取文件类型
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- !HDU 2602 Bone Collector--DP--(裸01背包)
题意:这题就是一个纯粹的裸01背包 分析:WA了好几次.01背包实现的一些细节没搞懂 1.为什么dp[i][j]赋初值为0而不是value[i].由于第i个石头可能不放! 2.在进行状态转移之前要dp ...
- ios svn repository
xcode默认自带Git和svn,首先讲下xcode4.6.3下配置svn: 1.检測你的mac中是否安装了svn: (1) 打开终端,输入 svn --version 假设出现下图信息,则说明已经安 ...
- pip报错
You are using pip version 9.0.1, however version 10.0.1 is available.You should consider upgrading v ...
- Redis封装之Hash
RedisHashService: /// <summary> /// Hash:类似dictionary,通过索引快速定位到指定元素的,耗时均等,跟string的区别在于不用反序列化,直 ...
- WP8 学习笔记(002_应用程序结构)
下图是微软官方给出的WP8应用程序执行顺序: 在App.XAML.CS中,有程序主要步骤的函数 // 应用程序启动(例如,从“开始”菜单启动)时执行的代码 // 此代码在重新激活应用程序时不执行 pr ...
- PatentTips - System and method to deprivilege components of a virtual machine monitor
BACKGROUND INFORMATION An embodiment of the present invention relates generally to virtualization pl ...