Algorithm 在合并排序lg(n)+;1.

Algorithm 在合并排序lg(n)+;1.,algorithm,Algorithm,根据stackoveflow的建议,我阅读了一些问题和答案。我在学习cormen的《算法介绍》一书。这本书中所有的内容都解释得很清楚,但唯一没有解释的是如何在合并排序分析中计算树的高度 我还在读第二章,如果后面几章会解释的话,我还没读太多 我想问一下最上面的节点是否被划分了2次,以此类推。它给了我一个高度ln(n),也就是log2(n),如果我把主要问题分成五个子问题会怎么样。那会是log5(n)吗?请解释一下这是如何用对数表示的,为什么不用线性项呢 谢谢递归树表示递归过程中的自调用。典型的me

根据stackoveflow的建议,我阅读了一些问题和答案。我在学习cormen的《算法介绍》一书。这本书中所有的内容都解释得很清楚,但唯一没有解释的是如何在合并排序分析中计算树的高度

我还在读第二章,如果后面几章会解释的话,我还没读太多

我想问一下最上面的节点是否被划分了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路合并,树有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-waymergesort中,选择要合并的每个元素需要θ(logk)时间。无论是在理论上还是在实践中,你都不能忽视这一成本

怎么没有人已经有了这个用户名?@RyanHaining用户名不是唯一的它是log2(n),不是log2(10),是的,它应该是log5(n),但常数会更大,算法会更复杂。谢谢@soulcheck@StackOverflow如果有5个子问题,想象一下,与2个子问题相比,实际合并它们有多困难。