J'essaie de comprendre l'espace requis pour un Mergesort, O (n).
Je vois que les exigences de temps sont essentiellement, quantité de niveaux (logn) * fusionner (n) de sorte que fait (n log n).
Maintenant, nous allouons toujours n par niveau, dans 2 tableaux différents, à gauche et à droite.
Je comprends que la clé ici est que lorsque les fonctions récursives retournent l'espace est désalloué, mais je ne le vois pas trop évident.
En outre, toutes les informations que je trouve, seulement l'espace requis est O (n), mais ne l'expliquent pas.
Un conseil?Espace requis pour un tri par fusion
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 Ok, merci à @Uri, c'est le truc
Ce que je ne voyais pas au début est que le temps ne fait qu'ajouter, tandis que la mémoire ajoute et soustractions, de sorte que le montant maximum de le temps est à 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 n + n/2 + n/4 + n/8 ... peu importe combien de fois nous ajoutons, ce ne sera jamais plus grand que 2n, et quand nous atteindre le fond de la pile récursive et commencer à monter, nous ne conservons pas la mémoire utilisée pour la branche précédente, donc au maximum, 2n serait la quantité de mémoire utilisée, O (n).
@Arkaitz: "La plupart des implémentations" incluent l'implémentation que vous avez publiée. – Brian
J'ai posté ce que je comprends maintenant, corrigez-moi si mauvais s'il vous plaît. –
Vous le comprenez correctement. Le problème est avec le pseudo code, il est plus facile de visualiser le contrôle (et donc la complexité temporelle) plutôt que le contenu de la pile d'appels. – Uri