web-dev-qa-db-ja.com

複数のマシンで塗りつぶしアルゴリズムを実装する方法は?

MSペイントで使用される塗りつぶしアルゴリズムを実装する必要がある複数のマシンに分散した大きな画像があります。私は単一のマシンでそれを行うことができますが、複数のマシンではどのようなアプローチに従う必要があります。

4
Nikant

非常に抽象的に言えば、関連コンポーネントのラベリングは、同値関係の閉鎖の例です。

  • 最初は、ピクセルのいくつかのペアの同値関係のみを知っています。具体的には、互いに隣接している(隣接している)ピクセルの同値関係のみを知っています。
  • 各ピクセルには、バイナリ値(0または1)である色があります。隣接するピクセルの同値関係_(A, B)_はColor(A) == 1 AND Color(B) == 1として定義されます
  • さらに、ピクセルはすでに分割され、異なるマシンに保存されています。ピクセル_(A, B)_が隣接しているが、それらが異なるマシンM(A)およびM(B)に分割されている場合、これら2つのマシンは、2つのピクセルが存在するかどうかを確認するために情報を交換する必要があります。等価関係。
  • タスクは同値関係の閉包の例であるため、分割統治法をいつでも使用できます。
    • ピクセルの各パーティション内で同値関係のクロージャーを実行します(それらがマシン間でどのように格納されているかに依存します)。基本的には、隣接するピクセルABのすべてのペアのケースを処理します。ここで、M(A)M(B)は、Mごとに同じです。
    • 異なるマシン上にあるピクセルのペア間で同値関係のクロージャーを実行します。基本的に、M(A)M(B)が異なる場合を処理します。
    • 各ピクセルのラベルを更新する最終ラウンドを実行して、結果を出します。

いくつかの可能な実装戦略があります。選択はパフォーマンスに大きく影響し、パフォーマンスは入力データによっても影響を受ける可能性があります。 (言い換えれば、最良の場合の入力と最悪の場合の入力の間のパフォーマンスは重要になる可能性があります。)


Cc by-sa 3.0に基づいてライセンスされたユーザーの貢献と帰属表示が必要 (content policy)

enter image description hereenter image description hereenter image description hereenter image description hereenter image description here

3
rwong

私は幅優先のアプローチを使用します。大きな画像をタイルに分割し、各ワーカーに1つのタイルを所有させ、その隣人を把握します。通常どおり最初のタイルを塗りつぶします。いずれかの場所がタイルの端に接触していて、その方向に隣人がいる場合は、場所と色の情報を含む隣人にメッセージを送信して、塗りつぶすかどうかを決定できるようにします。次に、ネイバーのタイルエッジに到達しなくなるまで、各ネイバーにこのプロセスを繰り返してもらいます。

免責事項:私はこれまでこのようなものを実装したことがなく、どのような欠陥があるのか​​わかりません。この問題については約5分の検討に値し、変更が必要になる場合があります。

1
Daenyth