递归树表示递归过程中的自我调用。典型的mergsort自己调用两次,每次调用排序一半的输入,所以递归树是一个完整的二叉树。
观察增加的高度在它们的节点的数字中显示的图案的该完整的二叉树:
height new "layer" total nodes
(h) of nodes (N)
1 1 1
2 2 3
3 4 7
4 8 15
...
在L电平的每个新层具有2 ^大号节点(其中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 2 H - 1)/ 4,求解小时,
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-way mergesort中,选择要合并的每个元素需要Theta(log K)时间。您无论从理论上还是实践上都不能忽视这一成本!
没有人有这个用户名? – 2014-09-02 22:07:17
@RyanHaining用户名不是唯一的 – 2014-09-02 22:07:39
它是log2(n),不是log2(10),是的,它会是log5(n),但常数会更大,算法更复杂。 – soulcheck 2014-09-02 22:09:04