根方法如何在 Quick-Union 中工作?

问题描述

我最近在 Coursera 上学习普林斯顿算法课程。本课程首先教授一种名为 Quick-Union 的算法来解决动态连接问题..

虽然我理解算法的目的和实现 - 我无法理解 root 函数在下面提供的代码中是如何工作的。我已经为我的实现提供了类和主要方法

public class QuickUnionUF {

private int[] id;

public QuickUnionUF(int N) {
    id = new int[N];
    for(int i = 0; i < N; i++) {
        id[i] = i;
    }
}

public int root(int k) {
    while(k != id[k]) { k = id[k]; }
    return k;
}

public  boolean connected(int p,int q) {
    return root(p) == root(q);
}

public void union(int p,int q) {
    int i = root(p);
    int j = root(q);
    id[i] = j;
}

public void print() {

    System.out.println("Indicies: 0 1 2 3 4 5 6 7 8 9");
    System.out.print("Elements: ");
    for(int i = 0; i < id.length; i++) {
        System.out.print(id[i] + " ");
    }
}


//Main Method 
public static void main(String[] args) {

    QuickUnionUF array = new QuickUnionUF(10);

    array.union(2,9); 
    array.union(3,4);
    array.union(4,9);
    array.union(5,6);

    System.out.println("\n The root of 3 is " + array.root(3));

}

//联合命令产生以下数组:{0 1 9 4 9 6 6 7 8 9}

输出 3 的根 3 的根是 9

我已按照与讲师使用的数组相匹配的方式排列数组,这就是我执行这些特定联合命令的原因。 但是,我无法理解为什么 3 的根返回 9。 从图形上看,这是有道理的,但 root 方法只是表达:

当作为参数传递的数字不等于它引用的元素时,请将输入的数字(索引)更改为它引用的元素。

我相信 root 方法为 root(3) 执行了一次。似乎只有 1 次迭代,只是返回 9。这是怎么发生的?不应该将 k (3) 设置为 id[k] (4) 然后简单地返回 4,因为现在 k = id[k] 吗?它返回 9.. 我使用调试器获得了一些见解,但无法得出合理的结论。 关于确切问题的另一个 StackOverflow 帖子,但我没有发现特别有见地。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)