建堆O(n)时间复杂度证明

原创 2015年07月10日 16:31:55

建堆复杂度先考虑满二叉树,计算完全二叉树建堆复杂度基本相同。

对满二叉树而言,第i层(根为第0层)有2^i个节点。由于建堆过程自底向上,以交换作为主要操作,因此第i层任意节点在最不利情况下,需要经过(n-i)次交换操作才能完成以该节点为堆根节点的建堆过程。因此,时间复杂度计算如下:

T(n) = 2^0 * (n - 0) + 2^1 * (n - 1) + ... + 2^n * (n - n) = sum((n - i) * 2^i)

采用错位相减法:

  • 原式乘2得:
  • T(n) * 2 = 2^1 * (n - 0) + 2^2 * (n - 1) + ... + 2^(n+1) * (n - n)
  • = sum((n - i) * 2^(i+1))
  • 原式如下:
  • T(n) = 2^0 * (n - 0) + 2^1 * (n - 1) + ... + 2^n * (n - n)
  • = sum((n - i) * 2^i)
  • 相减得:
  • 2T(n) - T(n) = -n + 2^1 + 2^2 + ... + 2^n = 2 * (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 - logN / N - 2 / N) ≈ N

故时间复杂度为O(N),得证。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Manacher算法:求解最长回文字符串,时间复杂度为O(N)

转载自http://blog.csdn.net/yzl_rex/article/details/7908259 回文串定义:“回文串”是一个正读和反读都一样的字符串,比如“level”或者“...

O(n)时间复杂度求最长回文串

1.问题描述 对于给定的一的个字符串,求

Manacher算法O(n) 时间复杂度求最长回文字串及其长度

O(n)回文子串算法     这里,我介绍一下O(n)回文串处理的一种方法。Manacher算法. 原文地址: http://zhuhongcheng.wordpress.com/2009/08...
  • wr132
  • wr132
  • 2015-08-12 09:01
  • 400

寻找数组中第k小的数:平均情况下时间复杂度为O(n)的快速选择算法

又叫线性选择算法,这是一种平均情况下时间复杂度为O(n)的快速选择算法,用到的是快速排序中的第一步,将第一个数作为中枢,使大于它的所有数放到它右边,小于它的所有数放到它左边。下面是具体的算法步骤: 1...

Excel 取两页中相同的数据项算法二 时间复杂度O(n)

将Sheet3 和Sheet5 中的数据项同时按关键列排序, 一般默认按A-Z升序排列.  (关于数组的排序可以参考高效的QuickSort排序算法). 在此不将Sheet3 和Sheet5 的排序的...

强大的随机算法-简洁的O(n)时间复杂度解决查找第k大数问题优化算法

之前用了个分治法, 但是由于过于复杂,估计很多人都不想使用。 下面我用随机法来解决这个问题吧,随机法更加优化了,而且更加重要的是更加简单了。 我刚看到这个算法也是震惊了,只有分治法的不到三分之二的...

寻找 最小的k个数 线性选择算法 平均时间复杂度 O(n)

/* description: 寻找最小的k个数 有n个数,请找出最小的k个数要求时间复杂度尽可能低。方法1:全排序 时间复杂度O(n*logn) 方法2:部分排序 维护一个容量为k的堆 O(n*...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)