Tôi đang gặp vấn đề với viết quicksort trong erlang. Những gì tôi đang làm là tôi đang sinh ra hai quy trình và sau đó chặn quá trình hiện tại cho đến khi tôi nhận được phản hồi từ cả hai mảng phụ bên trái và bên phải. Nhận được cả hai câu trả lời này, tôi gửi một tin nhắn cho cha mẹ của nó cho nó danh sách tính toán. Parent ! {self(), Lone ++ [H] ++ Ltwo}
Vấn đề với quicksort song song trong erlang
Nhưng tôi đang gặp lỗi khi vô hiệu hóa việc hoàn tác trong cả hai quy trình phụ. Đây là mã.
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).
gọi là:
main:sortquick([12,4,7,22,25]).
Câu hỏi: Hiện tại tôi đang đọc cuốn sách của Joe Armstrong, nơi ông cho thấy thuật toán quicksort tương tự (không song song) với nhận xét sau: "Mã này thể hiện sự thanh lịch hơn là hiệu quả của nó. theo cách này thường không được coi là thực hành lập trình tốt. " Bất kỳ ý kiến về điều đó từ các nhà phát triển Erlang có kinh nghiệm hơn liên quan đến giải pháp của pranjal? –
++ đều ổn. Trình biên dịch sẽ tối ưu hóa nó. Đây là liên kết http://www.erlang.org/doc/efficiency_guide/myths.html#id2259083 – user425720
Cảm ơn bạn, đó là một liên kết thú vị! –