10000x10000 個の要素がすべて値「0」を持つ非常に大きな行列があるとします。「1」の大きな「巣」がいくつかあるとしましょう。これらの領域は接続されている可能性もありますが、「1」の「パイプ」によって非常に毎週接続されています。
これらの「1」の「ネスト」を非常に迅速に(必要に応じてダーティに)見つけるアルゴリズムを取得したいと考えています。ここでは、2 つの毎週接続された「巣」を「切り離す」べきではありません。
このようなアルゴリズムをどのように行うべきか考えていますか?
この場合、A* (または BFS や DFS などのより単純なもの) のような経路探索アルゴリズムが機能する可能性があります。
あなたはできる:
AND
して、すべてのパイプの接続ポイントを取得します。それは、データがどのように必要とされるかによると思います。2 つのポイントが与えられた場合、それらが同じ 1 のブロックにあるかどうかを確認する必要がある場合は、@Jack の回答が最適だと思います。これは、ブロックが最初にどこにあるかについてある程度の知識がある場合にも当てはまります。これは、それらをアルゴリズムの開始点として使用できるためです。
他の情報がない場合は、次のいずれかが考えられます。
ポイントが与えられ、同じブロック内のすべての要素を検索したい場合は、塗りつぶしが適切です。次に、各ネストを見つけたらキャッシュし、別のポイントを取得したら、最初にそれが既知のネストにあるかどうかを確認し、そうでない場合はフラッド フィルを実行してこのネストを見つけ、それをキャッシュに追加します。
実装の詳細として、マトリックスをトラバースすると、各行は前の行に存在するネストのセットを使用できるようにする必要があります。次に、新しいポイントが既知のセットにあるかどうかを判断するために、完全なセットではなく、それらのネストに対して新しいポイントをチェックするだけで済みます。
確率的な影響に対処できる場合は、ハッシュテーブルやブルーム フィルターなど、ルックアップ コストが非常に低いセット実装を必ず使用してください。