堆排序中建堆时间复杂度

若是仅从代码上直观观察,会得出构造二叉堆的时间复杂度为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页也有证实,不过用到的方法不同。

相关文章
相关标签/搜索