我有這個數組(A),其中有n個元素保證被排序,我需要在並行系統中對它們執行二進制搜索。我開始做這個二進制搜索算法。這是迭代的,因爲我不確定如何將遞歸合併到並行處理中。如何將此順序迭代二進制搜索轉換爲並行算法?
/* Looking for element k in array A of length n */
min = 0;
max = n - 1;
while(min <= max)
{
midpoint = min + ((max-min)/2); //index
if(A[midpoint] > k) //discard upper half
max = midpoint - 1;
else if(A[midpoint] < k) //discard lower half
min = midpoint + 1;
else
return midpoint; //Found k, return index
}
return -1; //not found
在並行算法中,我有權訪問p處理器,它是一個允許併發讀取但獨佔寫入的系統。真正的問題是我仍然在按順序思考。也就是說,我看不出有多個處理器可以做到這一點,因爲如果不先知道中點數據的位置,就不能「丟掉」數組中不需要的部分。這看起來很內在順序。
僞代碼:
Global: //Variables accessible by all processors
index; //index of k
p; //number of processors
i; //the i^th processor
n; //number elements in array A
A[0, 1, ... , (n-1)];
local: //Variables accessible by only the owning processor
//Not sure what I need yet
Begin
Spawn(P1, P2 . . . P(p-1)); //"create" the p processors
for all P where 0 <= i <= (p-1) do //each processor does the following code
//I'm stuck here
endfor
End
最後一件事:我看到張貼詢問是否有辦法做並行處理的二進制搜索用戶的問題。這個問題沒有真正的決定性答案,因爲這兩個相關答案都獲得了1票。有人說這實際上是不可能的,因爲這是一個循序漸進的過程,而另一個似乎非常確信實施起來會很容易。你怎麼看?
Previous Parallel Binary Search Question
我會建議拆分和運行..在我注意到這是你鏈接的第二個答案之前。技術上效率低下,但可能更快。但我猜想另一個問題造成混淆的原因是因爲這不是簡單的二進制搜索,而是簡單的混淆搜索本身。 –
分割成「P」塊可以通過'O(log P)'步驟縮短搜索階段的時間。但是設置'P'線程需要'O(P)'時間。 –