%在保證尾遞迴的情況下,使用乙個輔助函式 handl 對parallel_qsort進行包裝,則parallel_qsort只管 分發任務即可,計算好了 再進行樹形通訊合併,之前一直在糾%結於是不是要使用程序字典,來儲存有哪些程序,程序字典,在erlang program一書中,不建議採用,因為其提供了共享資料的可能,破壞了erlang的設計原則,erlang是面向訊息的語言,進行間通訊只能通過訊息。-module (parallel_qsort).
-export ([start/2,handle/5]).
% 測試資料
% parallel_qsort:start([11,3,2,8,9,4,10,23,45,100,15,0,-1,47,9,32,12,64,5,35,79,77,27,1,6,7],8).
% parallel_qsort:start([11,3,2,8,9,4,33,34,34,10,23,45,100,15,0,-1,47,9,32,12,64,5,35,79,77,27,1,6,7],8).
% 啟動執行緒的工作
% 1.啟動 各個執行執行緒
start (data ,m) ->
io:format("len : ~w~n",[lists:flatlength(data)]),
spawn(?module,handle,[data,m,m,1,self()]).
% 包裝parallel_qsort,和合併結果的操作
handle(data,m,processnum,id,master) ->
io:format("id ~w~n",[id]),
= parallel_qsort(data,m,processnum,id,master,[self()]),
merge_wait(res,master,id,2,processnum,pids).
% 通過id 判斷 改發還是改接,master 是要發給的程序 ,m是遞迴的輪數
merge_wait(res,master,id,judge,m,pids) when m =:= 1 ->
io:format("result : ~w :~w ~n",[res,lists:flatlength(res)]);
merge_wait(res,master,id,judge,m,[hid|tids]) ->
if id rem judge =:= 1 ->
receive
-> %不能判斷接收的順序
io:format("receive: ~w ~w ~n",[id,newres]),
merge_wait(newres,master,id,judge*2,m div 2,tids)
end;
true ->
io:format("send from ~w ~w ~n",[id,res]),
master !
end.
% 劃分 分發任務
% 直到 列表很小或者m=0(沒有單獨核來跑程序) 序列排序
% 此時 將自己的結果和id發回主線程
parallel_qsort(data,m,start,id,master,pids) ->
len = lists:flatlength(data),
if m =:= 1->
newdata = lists:sort(data),
io:format("get ~w ~w ~n",[id,newdata]),
;true ->
= partition(data),
% io:format("~w:~w ~n",[frontpart,behindpart]),
pid = spawn(?module,handle,[behindpart,(m div 2),start,id+(m div 2),self()]),
parallel_qsort(frontpart,m div 2,start,id,master,[pid|pids])
end.
partition() -> ;
partition([h|t]) when t =:= -> ;
partition([h|t]) ->
.
erlang 實現psrs 並行排序演算法
module psrs export start 2,handle 1 測試資料 psrs start 15,46,48,93,39,6,72,91,14,36,69,40,89,61,97,12,21,54,53,97,84,58,32,27,33,72,20 3 將資料分給各個程序,並建立 no...
Erlang 奇偶並行排序
module exe9 export start 2,handle 4 l 2,12,14,25,31,42,43,43,13,34,34,41,41,312,352,354 將資料分給各個程序,並建立 nodecreater pids,m,id,master io format pids w id...
並行快速排序
感謝淺水清流投遞本稿。併發演算法是多核時代開始流行的技術趨勢,比如tbb,ppl都提供了大量有用的併發演算法。經典演算法中,排序是乙個很適合採用分治法併發的場合,比如快速排序。常規的快速排序,先在陣列中選取乙個基準點,將陣列分割槽為小於基準點和大於基準點 相同的數可以到任一邊 對分割槽的子陣列遞迴的...