Kruskal算法实现

时间:2017-07-06 12:37:56

标签: 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 parent = node.parent;
        if (parent == node) {
            return parent;
        }
        node.parent = findSet(node.parent);
        return node.parent;
    }

以下是指向code的完整链接 这是Kruskal Algorithm

的链接

我很困惑他们为什么要返回一个节点,该节点的父亲本身而不是不同的节点,以及当等级设置为0时实施Union时等级用于什么.I&#39 ;我们试图找到其他Kruskal算法代码和解释,但很少有消息来源实现。

1 个答案:

答案 0 :(得分:0)

Kruskal的算法是这样的:

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

    1. 它的子树"主人" node(如果node.parent == node)
    2. 不是非主设备,并且具有指向同一子树中另一个节点的链接(如果node.parent!= node)
    3. 当您测试边是否连接两个单独的子树时,您将第一个节点的主节点与第二个节点的主节点进行比较。如果它们相等,则节点在同一子树中,您可以忽略边缘。

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

      当您最终拥有一个具有(node.parent == node)的主节点时,您将拥有一个完整的树。当然,简单地计算边缘更容易,因为您期望树的N-1边缘。