MSペイントで使用される塗りつぶしアルゴリズムを実装する必要がある複数のマシンに分散した大きな画像があります。私は単一のマシンでそれを行うことができますが、複数のマシンではどのようなアプローチに従う必要があります。
非常に抽象的に言えば、関連コンポーネントのラベリングは、同値関係の閉鎖の例です。
(A, B)
_はColor(A) == 1 AND Color(B) == 1
として定義されます(A, B)
_が隣接しているが、それらが異なるマシンM(A)
およびM(B)
に分割されている場合、これら2つのマシンは、2つのピクセルが存在するかどうかを確認するために情報を交換する必要があります。等価関係。A
とB
のすべてのペアのケースを処理します。ここで、M(A)
とM(B)
は、M
ごとに同じです。M(A)
とM(B)
が異なる場合を処理します。いくつかの可能な実装戦略があります。選択はパフォーマンスに大きく影響し、パフォーマンスは入力データによっても影響を受ける可能性があります。 (言い換えれば、最良の場合の入力と最悪の場合の入力の間のパフォーマンスは重要になる可能性があります。)
Cc by-sa 3.0に基づいてライセンスされたユーザーの貢献と帰属表示が必要 (content policy)
私は幅優先のアプローチを使用します。大きな画像をタイルに分割し、各ワーカーに1つのタイルを所有させ、その隣人を把握します。通常どおり最初のタイルを塗りつぶします。いずれかの場所がタイルの端に接触していて、その方向に隣人がいる場合は、場所と色の情報を含む隣人にメッセージを送信して、塗りつぶすかどうかを決定できるようにします。次に、ネイバーのタイルエッジに到達しなくなるまで、各ネイバーにこのプロセスを繰り返してもらいます。
免責事項:私はこれまでこのようなものを実装したことがなく、どのような欠陥があるのかわかりません。この問題については約5分の検討に値し、変更が必要になる場合があります。