如何在合并排序lg(n)+1中递归树的高度

时间:2014-09-02 22:05:03

标签: algorithm

我按照stackoveflow的建议阅读了几个问题。我正在按照cormen的书介绍算法,以供我自学。在该书中已经清楚地解释了所有内容,但唯一没有解释的是如何在合并排序分析中计算树的高度。

如果在后面的章节中解释,我仍然在第2章还没有走远。

我想询问最顶层的节点是否被划分2次,依此类推。它给出了ln(n)的高度,即log 2 (n)如果我将主要问题分成五个子问题,该怎么办?那会是log 5 (n)吗?请解释这是如何用对数表示的,为什么不用某种线性项呢?

由于

1 个答案:

答案 0 :(得分:2)

递归树表示递归过程中的自调用。典型的mergsort调用自己两次,每次调用排序输入的一半,因此递归树是一个完整的二叉树。

观察到高度增加的完整二叉树树在其节点数中显示一个模式:

height   new "layer"  total nodes
(h)      of nodes     (N) 
1        1            1          
2        2            3
3        4            7
4        8            15
...

级别L的每个新层都有2 ^ L个节点(其中级别0是根)。所以很容易看出总节点N作为h的函数只是

N = 2^h - 1

现在解决h:

h = log_2 (N + 1)

如果你有一个5向分割和合并,那么树中的每个节点都有5个孩子,而不是2个。该表变为:

height   new "layer"  total nodes
(h)      of nodes     (N) 
1        1            1          
2        5            6
3        25           31
4        125          156
...

这里我们有N =(5 ^ h - 1)/ 4.求解h,

h = log_5 (4N + 1)

一般来说,对于K-way合并,树有N =(K ^ h-1)/(K-1),所以高度由

给出
h = log_K ((K - 1)N + 1) = O(log N)    [the log's base doesn't matter to big-O]

但是,要小心。在K-way mergesort中,选择要合并的每个元素需要Theta(log K)时间。你不能在理论上或在实践中忽略这个成本!