ああ、私の脳はちょうどギアに入ったところです、私は今賢明な提案をしています。もしこれがインタビューだったら多分遅すぎますが、気にしないでください:
マシン1は「制御マシン」と呼ばれるものとし、議論のために、すべてのデータから開始し、それを他の99台のマシンに同じ区画で送信するか、データがマシン間で均等に分散されて開始します。 1/99のデータを他のそれぞれに送信します。パーティションは同じでなくてもかまいません。
他の各マシンはそのデータをソートし、低い値を最初に見つけることを優先する方法でソートします。したがって、たとえばクイックソートでは、常にパーティションの下部を最初にソートします[*]。それは、できるだけ早く昇順でデータを制御マシンに書き戻します(ソートを続行するために非同期IOを使用し、おそらくNagleをオンにして:少し実験します)。
制御マシンは、データが到着すると99ウェイマージを実行しますが、マージされたデータは破棄し、検出した値の数を数えます。これは、中央値を2億分の1と1億分の1の値の合計として計算します。
これは「群れの中で最も遅い」問題に悩まされています。アルゴリズムは、中央値より小さいすべての値がソーティングマシンによって送信されるまで完了できません。そのような値の1つが、データのパーセル内で非常に高い可能性があります。したがって、データの初期分割が完了すると、推定実行時間は、データの1/99をソートして制御コンピューターに送信する時間と、コントロールがデータの1/2を読み取る時間の組み合わせになります。 。「組み合わせ」は、最大値とそれらの時間の合計の間のどこかにあり、おそらく最大値に近いでしょう。
私の直感は、ネットワークを介してデータをソートするよりも速く送信するためには(中央値を選択するだけでなく)、かなり高速なネットワークである必要があるということです。ネットワークが瞬間的であると推定できる場合、たとえば、データを含むRAMに同等にアクセスできる100個のコアがある場合は、より良い見通しになる可能性があります。
ネットワークI / Oがバインドされている可能性が高いため、少なくとも制御マシンに戻ってくるデータについて、いくつかのトリックをプレイできる可能性があります。たとえば、「1,2,3、.. 100」を送信する代わりに、ソーティングマシンが「100の値が101未満」を意味するメッセージを送信する可能性があります。次に、制御マシンは、変更されたマージを実行できます。このマージでは、これらの範囲内のすべての値の中で最小のものを見つけ、すべての並べ替えマシンにそれが何であるかを伝え、(a)制御マシンに方法を伝えます。その値より「カウント」する多くの値、および(b)ソートされたデータの送信をそのポイントから再開します。
より一般的には、制御マシンが99台の選別マシンでプレイできる、巧妙なチャレンジ/レスポンス推測ゲームがあるでしょう。
ただし、これにはマシン間の往復が含まれます。これは、私の単純な最初のバージョンでは避けています。私はそれらの相対的なパフォーマンスをブラインド推定する方法を本当に知りません、そしてトレードオフは複雑なので、これが本当の問題であると仮定して、私が自分で考えるよりもはるかに優れたソリューションがあると思います。
[*]利用可能なスタック許可-O(N)の余分なスペースがない場合、最初に実行する部分の選択は制約されます。ただし、十分な追加スペースがある場合はピックを選択できます。十分なスペースがない場合は、最初のいくつかのパーティションに対して最初に小さな部分を実行することで、コーナーを切り取るために必要なものを少なくとも使用できます。