Mam problem z pisaniem quicksort w erlangu. Co robię, uruchamiam dwa procesy, a następnie blokuję bieżący proces, dopóki nie otrzymam odpowiedzi od lewej i prawej pod-macierzy. Otrzymując obie te odpowiedzi, wysyłam wiadomość do jej rodzica, przekazując mu wyliczoną listę. Parent ! {self(), Lone ++ [H] ++ Ltwo}
Problem z równoległym quicksort w erlang
Ale dostaję błąd przyjmowania undef w obu podprocesach. Oto kod.
quick(Parent, []) -> Parent ! {self(), []};
quick(Parent, [H | T]) ->
Pone = spawn_link(main, quick, [ self(), [ X || X <- T, H >= X ] ]) ,
Ptwo = spawn_link(main, quick, [ self(), [ Y || Y <- T, H < Y ] ]) ,
receive
{Pone, Lone} ->
receive
{Ptwo, Ltwo} -> Parent ! {self(), Lone ++ [H] ++ Ltwo}
end;
{Ptwo, Ltwo} ->
receive
{Pone, Lone} -> Parent ! {self(), Lone ++ [H] ++ Ltwo}
end
end.
sortquick(List) ->
quick(self(), List).
nazywa się:
main:sortquick([12,4,7,22,25]).
Pytanie: Jestem obecnie czyta książkę Joe Armstrong, gdzie pokazuje podobny (choć nie równolegle) algorytm quicksort z następującym komentarzem: „. Ten kod jest pokazany na swoją elegancję niż jego efektywności Korzystanie ++ w ten sposób nie uważa się powszechnie za dobrą praktykę programistyczną. " Jakieś komentarze od bardziej doświadczonych deweloperów Erlang w odniesieniu do rozwiązania pranjal? –
++ są w porządku. Kompilator i tak to zoptymalizuje. Oto link http://www.erlang.org/doc/efficiency_guide/myths.html#id2259083 – user425720
Dziękuję, to był interesujący link! –