Próbuję zrozumieć wymagania dotyczące miejsca dla Mergesorta, O (n).
Widzę, że wymagania czasowe są w zasadzie, ilość poziomów (logn) * scalenie (n) tak, że robi (n log n).
Teraz wciąż przydzielamy n na poziom, w 2 różnych tablicach, w lewo i w prawo.
Rozumiem, że kluczem jest to, że gdy funkcje rekursywne zwrócą, przestrzeń zostaje zwolniona, ale nie widzę tego zbyt oczywistego.
Poza tym, wszystkie informacje, które znajduję, tylko stany stanów wymagane są O (n), ale nie wyjaśniają tego.
Dowolna podpowiedź?Wymagania przestrzenne dotyczące scalania-sortowania
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, dzięki @Uri, jest to sztuczka
Co nie udało mi się zobaczyć na samym początku jest to czas tylko dodaje, podczas gdy pamięć dodaje i odejmuje, więc maksymalna kwota czas jest na końcu wykonywania, ale maksymalna ilość pamięci znajduje się na samym dole stosu rekursywnego.
Tak więc, jeśli nadal dodajemy n + n/2 + n/4 + n/8 ... nie ma znaczenia, ile razy dodamy, nigdy nie będzie większy niż 2n, a kiedy Sięgnij po dno rekursywnego dołu i zacznij iść w górę, nie przechowujmy pamięci używanej dla poprzedniej gałęzi, więc przy max. 2n będzie to ilość wykorzystanej pamięci, O (n).
@Arkaitz: "Większość implementacji" obejmuje implementację, którą opublikowałeś. – Brian
Opublikowałem to, co teraz rozumiem, popraw mnie, jeśli źle, proszę. –
Rozumiesz to poprawnie. Problem polega na pseudo-kodzie, Łatwiej jest wizualizować kontrolę (a więc złożoność czasu) niż zawartość stosu wywołań. – Uri