构建二叉堆时间复杂度的证明
http://blog.csdn.net/linuxtiger/article/details/7172258
如果仅从代码上直观观察,会得出构造二叉堆的时间复杂度为O(n㏒n)的结果,这个结果是错的,虽然该算法外层套一个n次循环,而内层套一个分治策略下的㏒n复杂度的循环,该思考方法犯了一个原则性错误,那就是构建二叉堆是自下而上的构建,每一层的最大纵深总是小于等于树的深度的,因此,该问题是叠加问题,而非递归问题。那么换个方式,假如我们自上而下建立二叉堆,那么插入每个节点都和树的深度有关,并且都是不断的把树折半来实现插入,因此是典型的递归,而非叠加。
在做证明之前,我们的前提是,建立堆的顺序是bottom-top的。
正确的证明方法应当如下:
1. 具有n个元素的平衡二叉树,树高为㏒n,我们设这个变量为h。
2. 最下层非叶节点的元素,只需做一次线性运算便可以确定大根,而这一层具有2^(h-1)个元素,我们假定O(1)=1,那么这一层元素所需时间为2^(h-1) × 1。
3. 由于是bottom-top建立堆,因此在调整上层元素的时候,并不需要同下层所有元素做比较,只需要同其中之一分支作比较,而作比较次数则是树的高度减去当前节点的高度。因此,第x层元素的计算量为2^(x) × (h-x)。
4. 又以上通项公式可得知,构造树高为h的二叉堆的精确时间复杂度为:
S = 2^(h-1) × 1 + 2^(h-2) × 2 + …… +1 × (h-1) ①
通过观察第四步得出的公式可知,该求和公式为等差数列和等比数列的乘积,因此用错位想减发求解,给公式左右两侧同时乘以2,可知:
2S = 2^h × 1 + 2^(h-1) × 2+ …… +2 × (h-1) ②
用②减去①可知: S =2^h × 1 - h +1 ③
将h = ㏒n 带入③,得出如下结论:
S = n - ㏒n +1 = O(n)
结论:构造二叉堆的时间复杂度为线性得证。
上题有些小细节推导错误,整体思路是对的
构建二叉堆时间复杂度的证明相关推荐
- 二叉堆时间复杂度 php,二叉堆(Binary Heap)
二叉堆这个数据结构有点意思,自己做了个总结,内容结构如下: 二叉堆性质 二叉堆操作 应用 二叉堆性质: 堆(Heap)是一个可以被看成近似完全二叉树的结构,具有完全二叉树的特性: 缺少的叶子节点总是位 ...
- 二叉堆的节点插入、删除以及构建过程
目录 什么是二叉堆 二叉堆的基本操作 1.插入节点 2.删除节点 3.构建二叉堆 代码实现 什么是二叉堆 定义:二叉堆,本质上是一种完全二叉树. 分类:二叉堆分为最大堆和最小堆两种类型,最大堆和最小堆 ...
- 二叉堆与二叉堆的构建
什么是二叉堆? 二叉堆本质上是一种完全二叉树,它分为两个类型: 最大堆:任何一个父节点的值,都大于或等于它左.右孩子节点的值. 最小堆:任何一个父节点的值,都小于或等于它左.右孩子节点的值. 二叉堆的 ...
- 二叉堆的原理和构建、调整
/*** 二叉堆* <p>* 本质上是一种完全二叉树,分为最大堆和最小堆* 最大堆: 任何一个父节点的值都大于等于它左右孩子节点的值* 最小堆:任何一个父节点的值,都小于或者等于它左右孩子 ...
- 漫画:什么是二叉堆?(修正版)
转载自 漫画:什么是二叉堆?(修正版) 什么是二叉堆? 二叉堆本质上是一种完全二叉树,它分为两个类型: 1.最大堆 2.最小堆 什么是最大堆呢?最大堆任何一个父节点的值,都大于等于它左右孩子节点的值 ...
- 二叉堆 | 大根堆 小根堆
目录 何为二叉堆 二叉堆的调整 最大堆 最大堆的插入操作 最大堆的删除操作 最大堆的构建 最大堆code 最小堆 小根堆的插入操作 最小堆的删除操作 最小堆的构建 最小堆code 二叉堆的存储方式 何 ...
- 利用二叉堆实现最小优先队列
利用二叉堆实现最小优先队列 package 第二章数据结构基础;import java.util.Arrays;public class 二叉堆和优先队列 {public static void ma ...
- 动画 | 什么是二叉堆?
点击蓝色"五分钟学算法"关注我哟 加个"星标",天天中午 12:15,一起学算法 来源 | 算法无遗策 二叉堆的解释 (动态选择优先级最高的任务执行) 堆,又称 ...
- 数据结构之什么是二叉堆?
文章目录 什么是二叉堆? 二叉堆的自我调整 插入节点 删除节点 构建二叉堆 最小二叉堆的实现 最小堆的构建 最小堆插入节点并上浮 最小堆删除节点并下沉 最小堆的完整代码实现 最后 什么是二叉堆? 二叉 ...
最新文章
- 博士发公众号文章也能评国奖?双一流高校新规引热议!
- python不能处理excel文件-python处理Excel文件
- [zz]c++ list sort方法
- (JAVA)复制文件test.txt,并且排序。文件重新命名为test1.txt
- HTML head 头标签
- jQuery each、节点操作、动画演示、尺寸操作、扩展方法
- ipmitool 设置网关_使用ipmitool 修改管理卡IP等
- 毫米和像素怎么换算_像素换算(像素和毫米换算器)
- EMD+EEMD+CEEMD+CEEMDAN分解论文代码复现
- html5语文答题制作,语文万能答题模板
- 微信个人号API开发
- java中package的运用
- 《信心——是什么?导致什么?》_司布真
- 用Python爬取微信好友,原来他们是这样的人......
- 隐私合规:检测第三方SDK调用的隐私权限
- 对y_pred强制二分类
- zend studio设置字体大小和背景颜色
- R语言 - 集成开发环境IDE
- graphx-社区发现(community detection)
- 使用Xcode查看当前渲染性能以及渲染情况
热门文章
- centos7无法使用ifconfig且无法上网
- 八十二、归并排序求取复杂的逆序数
- 七、Sqoop架构,安装和基本使用
- 六十六,完成SpringBoot项目中的员工增删查改功能
- 几何梯度分析神经网络中不可信预测性
- 如何使用PyTorch的量化功能?
- greaterT()和lessT()
- 【SQL编程】MySQL 5.7.28 版本使用 SQL 直接解析 JSON 字符串(判断是否是合法JSON类型+文本深度+文本长度+值类型+keys获取+值获取+不同深度数据获取)
- python中list是什么类型_Python 入门系列 —— 13. List 类型简介
- mysql约束_从零开始学 MySQL - SQL 约束分类