Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Kruskal算法的实现_Java_Algorithm_Kruskals Algorithm_Disjoint Sets - Fatal编程技术网

Java Kruskal算法的实现

Java Kruskal算法的实现,java,algorithm,kruskals-algorithm,disjoint-sets,Java,Algorithm,Kruskals Algorithm,Disjoint Sets,我找到了一个创建make和查找方法的教程 public void makeSet(long data) { Node node = new Node(); node.data = data; node.parent = node; node.rank = 0; map.put(data, node); } private Node findSet(Node node) { Node pare

我找到了一个创建make和查找方法的教程

public void makeSet(long data) {
        Node node = new Node();
        node.data = data;
        node.parent = node;
        node.rank = 0;
        map.put(data, node);
    }

private Node findSet(Node node) {
        Node parent = node.parent;
        if (parent == node) {
            return parent;
        }
        node.parent = findSet(node.parent);
        return node.parent;
    }
这里是完整的链接 这里是链接到


我不明白为什么他们返回的节点的父节点是它自己,而不是不同的节点,并且当秩设置为0时,在实现Union时,秩是用来做什么的。我曾尝试寻找其他Kruskal算法代码和解释,但很少有源代码涉及到实现。

Kruskal算法的工作原理如下:

  • 将每个节点放在其自己的子树中
  • 按重量对边缘进行排序
  • 查找连接位于不同子树中的两个节点的第一个节点
  • 连接边连接的子树
  • 重复步骤3和4,直到没有更多的边要测试或树完成
  • 在此特定实现中,每个节点可以处于两种状态之一:

  • 它是子树的“主”节点(如果node.parent==node)
  • 是非主节点不是,并且具有指向同一子树中另一个节点的链接(如果node.parent!=node)
  • 测试边是否连接两个独立子树时,将比较第一个节点的主节点与第二个节点的主节点。如果它们相等,则节点位于同一子树中,您可以忽略边

    如果第一个节点的主节点不等于第二个节点的主节点,则加入这些子树:将“第二个节点的主节点”的父节点设置为第一个节点的主节点


    当您得到一个具有(node.parent==node)的主节点时,您就有了一个完整的树。当然,简单地计算边会更容易,因为你期望一棵树有N-1条边。

    Kruskal的算法是这样工作的:

  • 将每个节点放在其自己的子树中
  • 按重量对边缘进行排序
  • 查找连接位于不同子树中的两个节点的第一个节点
  • 连接边连接的子树
  • 重复步骤3和4,直到没有更多的边要测试或树完成
  • 在此特定实现中,每个节点可以处于两种状态之一:

  • 它是子树的“主”节点(如果node.parent==node)
  • 是非主节点不是,并且具有指向同一子树中另一个节点的链接(如果node.parent!=node)
  • 测试边是否连接两个独立子树时,将比较第一个节点的主节点与第二个节点的主节点。如果它们相等,则节点位于同一子树中,您可以忽略边

    如果第一个节点的主节点不等于第二个节点的主节点,则加入这些子树:将“第二个节点的主节点”的父节点设置为第一个节点的主节点


    当您得到一个具有(node.parent==node)的主节点时,您就有了一个完整的树。当然,简单地计算边会更容易,因为一棵树有N-1条边。

    我错过了链接谢谢我错过了链接谢谢