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

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

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

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

谢谢

最佳答案 递归树表示递归过程中的自调用.典型的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个子节点,而不是两个.该表变为:

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)时间.你不能在理论上或在实践中忽略这个成本!

点赞