0

各要素の関係を示す N*N ブール対称行列があります。

たとえば、マトリックス

1 0 1 
0 1 1
1 1 1

要素 1 が 1、3 と関係があることを意味します。要素 2 は 2、3 などと関係があります。

行列のサイズが大きい (N=9000) ため、要素をクラスター化したいので、ループに 3 つのレイヤーを使用したくなく、代わりにユニオン検索アルゴリズムを使用したいと考えています。

int labels[N];

static int find(int u){
    return u == labels[u] ? u : labels[u] = find(labels[u]);
}

static void myunion(int u,int v){
    labels[find(v)] = find(u); // the value of v is always larger than u
}

実行コードの場合:

for(int i=0;i<size;i++){
    for{int j=i+1;j<size;j++){
        if(matrix[i][j]==1){
            myunion(i,j);// the value of j is always larger than i
        }
    }
}

問題は、クラスター ラベルとして常に最小のインデックスを使用したいのですが、コードで正しいラベルが使用されないことがあります。

たとえば、要素 2、3、100 が関連しています。クラスタにラベル 2 を付けたいのですが、ラベル 100 の結果が得られました。誰か論理エラーを教えてもらえますか?

かどうかはわかりません

int pv = find(v);
int pu = find(u);

if(labels[pv]>=labels[pu]){
    labels[pv] = labels[pu];
}
else{
    labels[pu] = labels[pv];
}

例えば ​​{1,2,3}->label 1 ;{4,6}->label 4 の場合、union(3,4) を呼び出すと、labels[6] も1に変更?

4

0 に答える 0