Ich versuche, die Platzanforderungen für ein Mergesort, O (n) zu verstehen.
Ich sehe, dass Zeitanforderungen sind im Grunde, Menge an Ebenen (logn) * merge (n), so dass macht (n log n).
Jetzt vergeben wir noch n pro Ebene, in 2 verschiedenen Arrays, links und rechts.
Ich verstehe, dass der Schlüssel hier ist, dass, wenn die rekursiven Funktionen zurückkehren, der Raum freigegeben wird, aber ich sehe es nicht zu offensichtlich.
Darüber hinaus alle Informationen, die ich finde, nur Staaten benötigt Raum ist O (n), aber erkläre es nicht.
Irgendein Hinweis?Platzbedarf eines 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
EDIT Ok, dank @Uri, das ist der Trick
Was ich gleich am Anfang zu sehen, nur versäumt wird, dass die Zeit addiert, während der Speicher Additionen und Subtraktionen, so dass die maximale Menge an Die Zeit ist am Ende der Ausführung, aber die maximale Speichermenge befindet sich am unteren Ende des rekursiven Stacks.
Also, wenn wir hinzufügen, n + n/2 + n/4 + n/8 .... es spielt keine Rolle, wie oft wir hinzufügen, es wird nie größer als 2n, und wenn wir Erreichen Sie den rekursiven Stack-Bottom und fangen Sie an, nach oben zu gehen, wir behalten nicht den Speicher, der für den vorherigen Zweig verwendet wurde, also wäre 2n die Menge des verwendeten Speichers, O (n).
@Arkaitz: "Die meisten Implementierungen" enthält die Implementierung, die Sie gepostet haben. – Brian
Ich habe gepostet, was ich jetzt verstehe, korrigiere mich wenn falsch bitte. –
Sie verstehen es richtig. Das Problem ist mit Pseudocode. Es ist einfacher, die Kontrolle (und somit die Zeitkomplexität) zu visualisieren, als den Inhalt des Aufrufstapels. – Uri