Как я могу убедиться, что индекс является наименьшим в алгоритме поиска объединения?

У меня есть N * N булева симметричная матрица, чтобы показать отношения каждого элемента.

например матрица

1 0 1
0 1 1
1 1 1

означает, что элемент 1 имеет отношение с 1, 3; элемент 2 имеет отношение с 2,3 и т. д.

Теперь я хочу кластеризовать элементы, так как размер матрицы большой (N = 9000), я не хочу использовать три слоя для цикла и хочу вместо этого использовать алгоритм объединения-поиска.

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} -> метка 1; {4,6} -> метка 4, когда я вызываю union (3,4), метки [6] также будут модифицировано до 1?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]