私は現在、データベース システム (C++ で記述) に CCL アルゴリズムを実装する任務を負っています。このアルゴリズムは、指定された多次元配列のしきい値を超えるすべての値にラベルを割り当て、隣接するラベル付きの値には同じラベルが付けられます。
基本的な CCL アルゴリズムのコーディングは難しくありませんが、私のドメインでは、入力配列はデータベースの複数のインスタンスにランダムに分割されています。私の CCL オペレーターが呼び出されると、各インスタンスは、担当するデータのチャンクに対して操作を実行し、そのローカル CCL 結果を返します。次に、これらのローカル結果がマージされて、最終結果が生成されます。
実行時に、どのインスタンスが配列の特定の部分を担当しているのかわかりません。インスタンスは、最後のマージ手順まで互いに通信できません。
-=-=-=-
現在、私は次のことを行うことでこれを機能させています。
各インスタンスは、配列内の項目数と同じサイズのブール値の配列を作成し、すべての値を FALSE に設定します。
各インスタンスは、担当する値を調べ、それらの値がしきい値を超えているかどうかを確認します。そうであれば、ローカル配列の対応するブール値を TRUE に変更します。
インスタンスはすべてその配列をコーディネーターに送信します。コーディネーターは OR を使用して結果を結合し、最終的なブール ベクトルを作成します。
コーディネーターは、既にラベル付けされている値をスキップして、配列内のすべての値を調べます。値にラベルが付けられておらず、その値に対応するブール値が true の場合、新しいラベルが割り当てられ、すべての近隣 (および近隣の近隣など) に同じラベルが再帰的に割り当てられます。
ラベルのベクトルが返されます。
上記のアルゴリズムは機能しますが、複数のインスタンスを持つことを利用しているのはしきい値の計算だけです。この実装は単純にすべてを収集してコーディネーター上でスキャンするため、そもそも複数のインスタンスを使用するという点を無効にします。
-=-=-=-
基本的に、このアルゴリズムは自動的に分割統治アルゴリズムになりますが、分割は完全に無作為に制御できません。
各インスタンスで CCL の両方のスイープを実行し、コーディネーターでこれらのローカル CCL 結果を結合することで、この分割を利用したいと考えています。つまり、2 つのインスタンスが互いに隣接するラベルのグループを生成する場合、すべての値を再度スキャンすることなく、これら 2 つのラベルを結合したいと考えています。このイタリック体のポイントは、私たちに最も問題を引き起こしているものであり、どのように進めればよいかかなり迷っています. 調査するのに適したアルゴリズムまたはデータ構造の提案があれば、大歓迎です。