Les besoins en espace d'une fusion de tri

J'essaie de comprendre les besoins d'espace pour un Mergesort, O(n).
Je vois que des exigences en gros, le nombre de niveaux(logn) * fusion(n) de sorte que (n log n).
Maintenant, nous sommes toujours à l'allocation de n par niveau, dans les 2 différents tableaux, de gauche et de droite.
Je ne comprends que la clé ici est que, lorsque les fonctions récursives de retour de l'espace devient libéré, mais je ne vois pas trop évident.
En outre, toutes les infos que j'ai trouver, seulement des états de l'espace requis est de O(n), mais ne l'explique pas.
Tout soupçon?

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

MODIFIER
Ok, merci à @Uri, c'est le truc
Ce que je n'ai pas réussi à voir au tout début, c'est que le temps n'ajoute que, alors que la mémoire ajoute et soustrait, de sorte que le montant maximum de temps à la fin de l'exécution, mais la quantité maximale de mémoire est au bas de la pile récursive.

Donc, si nous continuons à ajouter de n + n/2 + n/4 + n/8.... il n'a pas d'importance combien de fois nous ajouter, ce ne sera jamais plus grand que 2n, et quand nous atteignons la pile récursive bas et commencer à monter, on ne garde pas la mémoire utilisée pour la branche précédents, donc au max, 2n serait la quantité de mémoire utilisée, O(n).

OriginalL'auteur Arkaitz Jimenez | 2010-06-03