Ho problemi con la scrittura quicksort in erlang. Quello che sto facendo è che sto generando due processi e poi bloccando il processo corrente fino a ottenere la risposta da entrambi i sub-array sinistro e destro. Ottenendo entrambe queste risposte mando un messaggio al suo genitore dandogli la lista calcolata. Parent ! {self(), Lone ++ [H] ++ Ltwo}
Problema con quicksort parallelo in erlang
Ma sto ottenendo errore di ottenere undef in entrambi i sottoprocessi. Ecco il codice.
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).
chiamato come:
main:sortquick([12,4,7,22,25]).
Domanda: Attualmente sto leggendo il libro di Joe Armstrong, dove si mostra una simile (non parallelo però) algoritmo quicksort con il seguente commento: ". Questo codice viene mostrato per la sua eleganza, piuttosto che la sua efficienza Utilizzando ++ in questo modo non è generalmente considerata una buona pratica di programmazione. " Qualche commento a riguardo degli sviluppatori di Erlang più esperti in merito alla soluzione di pranjal? –
++ vanno bene. Il compilatore lo ottimizzerà comunque. Ecco il link http://www.erlang.org/doc/efficiency_guide/myths.html#id2259083 – user425720
Grazie, è stato un link interessante! –