Я пытаюсь понять требования к пространству для Mergesort, O (n).
Я вижу, что временные требования в основном, количество уровней (logn) * merge (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, и когда мы достигнем рекурсивное нижнее дно стека и начать движение вверх, мы не сохраняем память, используемую для предыдущей ветки, поэтому при max 2n будет использоваться объем памяти O (n).