【发布时间】:2011-02-27 08:54:48
【问题描述】:
我正在尝试了解合并排序的空间要求,O(n)。
我看到时间要求基本上是级别数(logn)* 合并(n),这样就产生了(n log n)。
现在,我们仍然在每个级别分配 n,在左右 2 个不同的数组中。
我明白这里的关键是当递归函数返回时,空间被释放,但我没有看到它太明显。
此外,我找到的所有信息,只是说明所需的空间是 O(n),但不要解释它。
有什么提示吗?
function merge_sort(m)
if length(m) ≤ 1
return m
var list left, right, result
var integer middle = length(m) / 2
for each x in m up to middle
add x to left
for each x in m after middle
add x to right
left = merge_sort(left)
right = merge_sort(right)
result = merge(left, right)
return result
编辑
好的,感谢@Uri,这就是诀窍
一开始没看到的是时间只加,而内存加减,所以最大时间是在执行结束时,但最大内存是在递归栈的底部。
所以,如果我们继续添加 n + n/2 + n/4 + n/8.... 不管我们添加多少次,它永远不会大于 2n,当我们达到递归堆栈底部并开始向上,我们不保留前一个分支使用的内存,所以在最大值,2n 将是使用的内存量,O(n)。
【问题讨论】:
标签: algorithm sorting mergesort