加权联合规则

时间:2014-02-15 19:15:24

标签: data-structures union-find

如果我在最后一步(7)中使用规则,有人可以与我联系吗?

更新:

括号内的数字是参加联盟的每个集合的元素数量(权重(?))。大写字母是集合的名称。

据我所知:我们使用的元素数量作为我们的排名?这让人感到困惑,每个人都使用不同的术语来表达同样的东西。

我们有工会:

  1. U(1,2,A)
  2. U(3,4,B)
  3. U(A,B,C)
  4. U(5,6,d)
  5. U(7,8,E)
  6. U(d,C,F)
  7. U(E,F,G)
  8. enter image description here

2 个答案:

答案 0 :(得分:1)

步骤7(和其他人)看起来是正确的,但步骤6没有。

在步骤6中,4应该是根,因为那是更大的树。

答案 1 :(得分:0)

void combine(int x,int y)
{
    int xroot=find(x),yroot=find(y);
    if(rank[xroot]<rank[yroot]) 
        parent[xroot]=yroot;
    else if(rank[xroot]>rank[yroot]) 
    parent[yroot]=xroot;
    else 
    {///rank of both is equal..
        parent[yroot]=xroot;
        rank[xroot]++;
    }
}

使用排名,您会看到size of set,而不是顶点之和,因此步骤6是错误的。

但为什么size
因为如果我们使较大的根设置为较小集的根,我们需要update父节点数较少的父节点。

为了得到最好的解释,我建议CLRS (Introduction to Algorithms)

希望它可以帮到你!