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)

结论:构造二叉堆的时间复杂度为线性得证。

上题有些小细节推导错误,整体思路是对的

构建二叉堆时间复杂度的证明相关推荐

  1. 二叉堆时间复杂度 php,二叉堆(Binary Heap)

    二叉堆这个数据结构有点意思,自己做了个总结,内容结构如下: 二叉堆性质 二叉堆操作 应用 二叉堆性质: 堆(Heap)是一个可以被看成近似完全二叉树的结构,具有完全二叉树的特性: 缺少的叶子节点总是位 ...

  2. 二叉堆的节点插入、删除以及构建过程

    目录 什么是二叉堆 二叉堆的基本操作 1.插入节点 2.删除节点 3.构建二叉堆 代码实现 什么是二叉堆 定义:二叉堆,本质上是一种完全二叉树. 分类:二叉堆分为最大堆和最小堆两种类型,最大堆和最小堆 ...

  3. 二叉堆与二叉堆的构建

    什么是二叉堆? 二叉堆本质上是一种完全二叉树,它分为两个类型: 最大堆:任何一个父节点的值,都大于或等于它左.右孩子节点的值. 最小堆:任何一个父节点的值,都小于或等于它左.右孩子节点的值. 二叉堆的 ...

  4. 二叉堆的原理和构建、调整

    /*** 二叉堆* <p>* 本质上是一种完全二叉树,分为最大堆和最小堆* 最大堆: 任何一个父节点的值都大于等于它左右孩子节点的值* 最小堆:任何一个父节点的值,都小于或者等于它左右孩子 ...

  5. 漫画:什么是二叉堆?(修正版)

    转载自  漫画:什么是二叉堆?(修正版) 什么是二叉堆? 二叉堆本质上是一种完全二叉树,它分为两个类型: 1.最大堆 2.最小堆 什么是最大堆呢?最大堆任何一个父节点的值,都大于等于它左右孩子节点的值 ...

  6. 二叉堆 | 大根堆 小根堆

    目录 何为二叉堆 二叉堆的调整 最大堆 最大堆的插入操作 最大堆的删除操作 最大堆的构建 最大堆code 最小堆 小根堆的插入操作 最小堆的删除操作 最小堆的构建 最小堆code 二叉堆的存储方式 何 ...

  7. 利用二叉堆实现最小优先队列

    利用二叉堆实现最小优先队列 package 第二章数据结构基础;import java.util.Arrays;public class 二叉堆和优先队列 {public static void ma ...

  8. 动画 | 什么是二叉堆?

    点击蓝色"五分钟学算法"关注我哟 加个"星标",天天中午 12:15,一起学算法 来源 | 算法无遗策 二叉堆的解释 (动态选择优先级最高的任务执行) 堆,又称 ...

  9. 数据结构之什么是二叉堆?

    文章目录 什么是二叉堆? 二叉堆的自我调整 插入节点 删除节点 构建二叉堆 最小二叉堆的实现 最小堆的构建 最小堆插入节点并上浮 最小堆删除节点并下沉 最小堆的完整代码实现 最后 什么是二叉堆? 二叉 ...

最新文章

  1. 博士发公众号文章也能评国奖?双一流高校新规引热议!
  2. python不能处理excel文件-python处理Excel文件
  3. [zz]c++ list sort方法
  4. (JAVA)复制文件test.txt,并且排序。文件重新命名为test1.txt
  5. HTML head 头标签
  6. jQuery each、节点操作、动画演示、尺寸操作、扩展方法
  7. ipmitool 设置网关_使用ipmitool 修改管理卡IP等
  8. 毫米和像素怎么换算_像素换算(像素和毫米换算器)
  9. EMD+EEMD+CEEMD+CEEMDAN分解论文代码复现
  10. html5语文答题制作,语文万能答题模板
  11. 微信个人号API开发
  12. java中package的运用
  13. 《信心——是什么?导致什么?》_司布真
  14. 用Python爬取微信好友,原来他们是这样的人......
  15. 隐私合规:检测第三方SDK调用的隐私权限
  16. 对y_pred强制二分类
  17. zend studio设置字体大小和背景颜色
  18. R语言 - 集成开发环境IDE
  19. graphx-社区发现(community detection)
  20. 使用Xcode查看当前渲染性能以及渲染情况

热门文章

  1. centos7无法使用ifconfig且无法上网
  2. 八十二、归并排序求取复杂的逆序数
  3. 七、Sqoop架构,安装和基本使用
  4. 六十六,完成SpringBoot项目中的员工增删查改功能
  5. 几何梯度分析神经网络中不可信预测性
  6. 如何使用PyTorch的量化功能?
  7. greaterT()和lessT()
  8. 【SQL编程】MySQL 5.7.28 版本使用 SQL 直接解析 JSON 字符串(判断是否是合法JSON类型+文本深度+文本长度+值类型+keys获取+值获取+不同深度数据获取)
  9. python中list是什么类型_Python 入门系列 —— 13. List 类型简介
  10. mysql约束_从零开始学 MySQL - SQL 约束分类