如何通过联合查找将数据元素存储在组/集群中

时间:2019-02-13 08:35:08

标签: algorithm data-structures union-find

我已经实现了受this codethis 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可能不需要将数据元素存储在不同的组/集群中。我想知道我走的路是否正确?

1 个答案:

答案 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。这是因为,我们实际上是在寻找某个群集的根元素(或者只是找到实际上代表群集的元素)。