若是仅从代码上直观观察,会得出构造二叉堆的时间复杂度为O(n㏒n)的结果,这个结果是错的,虽然该算法外层套一个n次循环,而内层套一个分治策略下的㏒n复杂度的循环,该思考方法犯了一个原则性错误,那就是构建二叉堆是自下而上的构建,每一层的最大纵深老是小于等于树的深度的,所以,该问题是叠加问题,而非递归问题。那么换个方式,假如咱们自上而下创建二叉堆,那么插入每一个节点都和树的深度有关,而且都是不断的把树折半来实现插入,所以是典型的递归,而非叠加。算法
在作证实以前,咱们的前提是,创建堆的顺序是bottom-top的。spa
正确的证实方法应当以下:递归
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) ①margin
经过观察第四步得出的公式可知,该求和公式为等差数列和等比数列的乘积,所以用错位想减发求解,给公式左右两侧同时乘以2,可知:top
2S = 2^h × 1 + 2^(h-1) × 2+ …… +2 × (h-1) ②di
用②减去①可知: S =2^h × 1 - h +1 ③
将h = ㏒n 带入③,得出以下结论:
S = n - ㏒n +1 = O(n)
因此咱们能够得出结论:构造二叉堆的时间复杂度为线性得证。
另外在算法导论78页也有证实,不过用到的方法不同。