建堆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),得证。

建堆的时间复杂度O(N)

首先这个循环是从i = headsize/2 -> 1,也就是说这是一个bottom-up的建堆。于是,有1/2的元素向下比较了一次,有1/4的向下比较了两次,1/8的,向下比较了3次,......,...

为什么建堆的时间复杂度是O(n)?

如果仅从代码上直观观察,会得出构造二叉堆的时间复杂度为O(n㏒n)的结果,这个结果是错的,虽然该算法外层套一个n次循环,而内层套一个分治策略下的㏒n复杂度的循环,该思考方法犯了一个原则性错误,那就是构...
  • LeoSha
  • LeoSha
  • 2015年05月28日 09:01
  • 4083

时间复杂度O(n)什么意思

时间复杂度  算法分析  同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度和空间复杂度来考虑。...
  • Sunc23
  • Sunc23
  • 2015年03月27日 10:04
  • 700

计数排序,传说中时间复杂度O(n+k)的排序算法

基本思想 假设数序列中小于元素a的个数为n,则直接把a放到第n+1个位置上。当存在几个相同的元素时要做适当的调整,因为不能把所有的元素放到同一个位置上。计数排序假设输入的元素都是0到k之间的整数。 ...

[java实现]找一个数组的最大和的连续子数组(时间复杂度 O(n))

题目 输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3...
  • hpf911
  • hpf911
  • 2013年07月08日 20:53
  • 4074

合并两个排序数组(时间复杂度O(n))

有两个排序的数组A1和A2,内存在A1的末尾有足够多余的空间容纳A2。 请实现一个函数,把A2中的所有数字插入到A1中,并且所有数字是排序的. 思路:从末尾到头比较A1和A2中的数字,并把较大的...

时间复杂度O(f(n))

关于算法的时间复杂度O(f(n)) (一)算法时间复杂度定义:   在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:建堆O(n)时间复杂度证明
举报原因:
原因补充:

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