【问题标题】:Kruskal Algorithm implemenationKruskal 算法实现
【发布时间】:2017-12-10 11:20:54
【问题描述】:

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

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 时实施联合时等级的用途。我尝试查找其他 Kruskal 算法代码和解释,但很少有关于实施的资料。

【问题讨论】:

标签: java algorithm kruskals-algorithm disjoint-sets


【解决方案1】:

Kruskal 的算法是这样工作的:

  1. 把每个节点都放在自己的子树中
  2. 按权重对边进行排序
  3. 找到连接不同子树中两个节点的第一个节点
  4. 加入边连接的子树
  5. 重复第 3 步和第 4 步,直到没有要测试的边或树完成为止

在这个特定的实现中,每个节点都可以处于以下两种状态之一:

  1. 它是子树的“主”节点(如果 node.parent == 节点)
  2. 是非主节点,并且具有到同一子树中另一个节点的链接(如果 node.parent != 节点)

当您测试一条边是否连接两个单独的子树时,您将第一个节点的主节点与第二个节点的主节点进行比较。如果它们相等,则节点在同一子树中,您可以忽略边。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-04
    • 2012-03-16
    • 2013-01-17
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多