我按照stackoveflow的建议阅读了几个问题。我正在按照cormen的书介绍算法,以供我自学。在该书中已经清楚地解释了所有内容,但唯一没有解释的是如何在合并排序分析中计算树的高度。
如果在后面的章节中解释,我仍然在第2章还没有走远。
我想询问最顶层的节点是否被划分2次,依此类推。它给出了ln(n)的高度,即log 2 (n)如果我将主要问题分成五个子问题,该怎么办?那会是log 5 (n)吗?请解释这是如何用对数表示的,为什么不用某种线性项呢?
由于
答案 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)时间。你不能在理论上或在实践中忽略这个成本!