この配列 (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 つ: 並列処理で二分探索を行う方法があるかどうかを尋ねるユーザーからの質問が投稿されているのを見ました。該当する 2 つの回答が両方とも 1 票を獲得したため、その質問に対する決定的な回答はありませんでした。1 人は、これは段階的なプロセスであるため事実上不可能であると述べましたが、もう 1 人は、実装が非常に簡単であると確信しているように見えました。あなたの考えは何ですか?