Data structures 加权并集规则

Data structures 加权并集规则,data-structures,union-find,Data Structures,Union Find,有人能和我核实一下我在最后一步(7)中是否正确使用了规则吗 更新: 括号内的数字是参与联合的每个集合的元素数(权重(?)。大写字母是集合的名称 正如我所理解的:我们使用元素的数量作为我们的排名?这让人困惑,每个人对同一件东西使用不同的术语 我们有工会: U(1,2,A) U(3,4,B) U(A、B、C) U(5,6,D) U(7,8,E) U(D、C、F) U(E、F、G) 第7步(和其他步骤)看起来正确,但第6步不正确 在步骤6中,4应该是根,因为那是较大的树。void combine(in

有人能和我核实一下我在最后一步(7)中是否正确使用了规则吗

更新:

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

正如我所理解的:我们使用元素的数量作为我们的排名?这让人困惑,每个人对同一件东西使用不同的术语

我们有工会:

  • U(1,2,A)
  • U(3,4,B)
  • U(A、B、C)
  • U(5,6,D)
  • U(7,8,E)
  • U(D、C、F)
  • U(E、F、G)
  • 第7步(和其他步骤)看起来正确,但第6步不正确

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

    void combine(intx,inty)
    
    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]++;
        }
    }
    
    { int xroot=find(x),yroot=find(y); if(秩[xroot]秩[yroot]) 父[yroot]=xroot; 其他的 {///两者的秩相等。。 父[yroot]=xroot; 秩[xroot]++; } }
    使用秩,可以看到集合的
    大小,而不是顶点的总和,因此步骤
    6
    是错误的

    但是为什么
    尺寸

    因为如果我们将较大集合的根设为较小集合的根,我们需要更新较小数量节点的父节点

    为了得到最好的解释,我建议


    希望它能帮助你

    1+2+3+4=10和5+6=11,6不应该是步骤6中的根吗?(权重的原因)我从未见过使用节点值作为权重的联合查找算法-这也没有什么意义,因为节点值与操作的运行时间并不真正对应。它通常使用树的高度/深度。我按照您的指示更新了我的问题,我认为现在它是正确的(?)。抱歉,问题中有一个陷阱,我进行了编辑。这些事情很棘手!