我已经实现了受this code和this API启发的联合查找算法:
void unify(int p, int q)
int find(int p)
boolean connected(int p, int q)
int clusterSize(int p)
然后我检测到带有嵌套循环的集群,如下所示:
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
要将每个群集/组实际存储在单独的array
中,当前我遍历所有数据元素并像这样调用find
:
for i = 0 to data-size
k = find(i);
// ... Store data element "i" in cluster "k" (array "k")
end-for
我觉得最后一个for loop
可能不需要将数据元素存储在不同的组/集群中。我想知道我走的路是否正确?
答案 0 :(得分:1)
首先,您需要通过将每个元素设置为单独的簇来进行初始化。这样做时,不需要调用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
。这是因为,我们实际上是在寻找某个群集的根元素(或者只是找到实际上代表群集的元素)。