Estoy tratando de comprender los requisitos de espacio para un Mergesort, O (n).
Veo que los requisitos de tiempo son básicamente, la cantidad de niveles (logn) * merge (n) por lo que hace (n log n).
Ahora, todavía estamos asignando n por nivel, en 2 matrices diferentes, izquierda y derecha.
Entiendo que la clave aquí es que cuando las funciones recursivas regresan el espacio se desasigna, pero no lo veo demasiado obvio.
Además, toda la información que encuentro, solo indica que el espacio requerido es O (n) pero no lo explica.
¿Alguna pista?Requisitos de espacio de merge-sort
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
EDITAR Bien, gracias a @Uri, este es el truco
Lo que no ver al principio es que el tiempo sólo se suma, mientras que la memoria suma y resta, por lo que la cantidad máxima de el tiempo está al final de la ejecución, pero la cantidad máxima de memoria está en la parte inferior de la pila recursiva.
Por lo tanto, si seguimos agregando n + n/2 + n/4 + n/8 .... no importa cuántas veces agreguemos, nunca será mayor que 2n, y cuando Alcanzar el fondo recursivo de la pila y comenzar a subir, no guardamos la memoria utilizada para la rama anterior, por lo que al máximo, 2n sería la cantidad de memoria utilizada, O (n).
@Arkaitz: "La mayoría de las implementaciones" incluye la implementación que ha publicado. – Brian
He publicado lo que entiendo ahora, corrígeme si está mal, por favor. –
Lo está entendiendo correctamente. El problema es con el pseudo código. Es más fácil visualizar el control (y, por lo tanto, la complejidad del tiempo) en lugar del contenido de la pila de llamadas. – Uri