Сначала вам нужно инициализировать, сделав каждый элемент отдельным кластером.При этом нет необходимости вызывать метод find
, так как изначально каждый из них сам является кластером.
int clusters[data_size];
for(int i = 0; i < data_size; i++)
{
clusters[i] = i; // each element refers to itself initially, indicating that it's a separate cluster
}
Теперь после проверки во вложенном цикле, какие элементы необходимо кластеризовать, а затем объедините их -
for i = (0) to (data size)
for j = (i+1) to (data size)
if ( "i" and "j" meet this condition )
unify(i,j)
end for
end for
В методе unify(p, q)
то, что вы можете сделать, -
clusters[find(p)] = find(q); // indicates p belongs to cluster number q
Или наоборот также верно -
clusters[find(q)] = find(p); // indicates q belongs to cluster number p
Естьметод ранжирования в алгоритме Union Find
, чтобы выбрать, какой из вышеперечисленных использовать.Это гарантирует - мы всегда будем объединять меньший кластер в больший.Но я полагаю, что вас сейчас это не беспокоит.
Теперь следующий вопрос - почему мы называем find
в вышеприведенном выражении.Это потому, что мы фактически находим корневой элемент определенного кластера (или просто находим элемент, который фактически представляет кластер).