标签:算法导论答案
6.4-5 在所有元素都不同的情况下,HEAPSORT的时间复杂度是Ω(nlgn)
证明:要证明这一点其实不难,只需直觉上理解——虽然堆序不“完整”,但也能在一定程度上确定大小关系,比如较小的元素多半高度很低(接近底层)。
首先进行一个粗略的计算(元素都不同):
堆中高度为0(即最底层)的节点数为总数的一半 n/2。那这些元素在整个元素集中大小位置是如何的呢:
先把这 n/2 个节点排好序,得到递增的序列(这里考虑最大堆),然后再来考虑在整个元素集中的大小位置。
其中第一大的在整个堆中最大也只能排到第 lgn 大,因为它有 lgn 个祖先,最小的在整个堆中必然也是最小的,因为最小值高度只能为0。
上面一句其实不重要,重要的是这 n/2 个元素在整个元素集中的大概分布。
上面第 2k + 1 大的元素在整个元素集中最大只能排到 lgn + 2k + 1 大,因为相隔2的元素必然有一个不同的祖先,而这个祖先必然存在较小的那个元素前面。
所以通过贪心构造出一个分布:
因为内部节点也有 n/2 个,所以未分配的祖先有 n/4,所以最底层元素大小位置排在 n/2 大之后的元素有 n/6个,考虑在排在 n/2 大之后是因为,经过 n/2 次弹出最小值后,这些排在后面的还是会留在堆中。
光是这 n/6 个元素构成的二叉堆,所有节点的深度(从最底层抽上去自己再降下来走的路径)之和都为 n/6lg(n/6)。
所以对于整个堆来讲,这些节点的深度之和一定不小于 n/6lg(n/6),由于后面的结果是几何减少的,加出来也差不多,就不算了。
也许你会觉得万一一个节点降到最底层,从而有的最底层节点没有从根节点下降会使得证明不成立。
其实是不会的,因为如果发生那种情况只要把没有被抽取的那个节点的深度想成 lgn (这一值比估计值还大)就行了,因为发生这种情况,另一个元素就相当于“替”它下降了。
所以HEAPSORT的时间复杂度是Ω(nlgn)。
标签:算法导论答案
原文地址:http://blog.csdn.net/u010383982/article/details/42740791