Tengo problemas para escribir quicksort en erlang. Lo que estoy haciendo es que estoy generando dos procesos y luego bloqueando el proceso actual hasta que obtengo la respuesta de las sub-matrices izquierda y derecha. Obteniendo ambas respuestas, envío un mensaje a su padre dándole la lista calculada. Parent ! {self(), Lone ++ [H] ++ Ltwo}
Problema con quicksort paralelo en erlang
Pero estoy recibiendo el error de obtener undef en ambos subprocesos. Aquí está el código.
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).
llamado como:
main:sortquick([12,4,7,22,25]).
Pregunta: Actualmente estoy leyendo el libro de Joe Armstrong, donde se muestra una similar (no en paralelo, aunque) algoritmo de ordenación rápida con el siguiente comentario: ". Este código se muestra por su elegancia en lugar de su eficiencia Utilizando ++ de esta manera, generalmente no se considera una buena práctica de programación ". ¿Algún comentario sobre eso de desarrolladores de Erlang más experimentados con respecto a la solución de pranjal? –
++ están bien. El compilador lo optimizará de todos modos. Aquí está el enlace http://www.erlang.org/doc/efficiency_guide/myths.html#id2259083 – user425720
¡Gracias, ese fue un enlace interesante! –