Я пытаюсь понять требования к пространству для Mergesort, O (n).
Я вижу, что время требования в основном, количество уровней (logn) * merge (n), так что делает (n log n).
Теперь мы по-прежнему выделяем n для каждого уровня в двух разных массивах: левый и правый.
Я понимаю, что ключевой момент здесь в том, что когда рекурсивные функции возвращают пространство, оно освобождается, но я не вижу этого слишком очевидным.
Кроме того, вся информация, которую я нахожу, просто требует, чтобы пространство состояний было 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
EDIT
Хорошо, спасибо @Uri, это трюк
В самом начале я не смог увидеть, что время только добавляет, а память добавляет и вычитает, поэтому максимальное количество времени находится в конце выполнения, но максимальное количество памяти находится на дне рекурсивного стека.
Итак, если мы продолжим добавлять n + n / 2 + n / 4 + n / 8 .... не имеет значения, сколько раз мы добавим, оно никогда не будет больше 2n, и когда мы достигнем дно рекурсивного стека и начало роста, мы не сохраняем память, использованную для предыдущей ветви, поэтому при максимальном значении 2n будет использоваться объем памяти, O (n).