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