algorithm - 我们可以为 Quick Union 算法的根部分设置一个 if 循环吗?

标签 algorithm

在下面的Quick Union algorithm imlementation中,在root方法中我们可以有一个if循环(例如if(i != id [i])而不是while循环吗?我认为它同样有效。那么为什么他们使用了 while 循环吗?

public class QuickUnionUF {
    private int []id;

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

    private int root(int i){
        while(i != id[i]) i = id[i];
        return i;
    }

    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;
    }
}

最佳答案

组件可以用比一级更高的树来表示。要获取组件 ID,您需要一直向下查找到根目录。例如尝试

s = new QuickUnionUF(3);
s.union(0,1);
s.union(1,2);
System.out.println(s.connected(0,1));  // <== prints false when using 'if'

关于algorithm - 我们可以为 Quick Union 算法的根部分设置一个 if 循环吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45250421/

相关文章:

c# - 最快的二维数据空间索引,一旦构建就无需更新

c# - SOA - 测试算法 10^62 键

php - 我如何整合 Reddit 页面/帖子排名算法?

c++ - 推荐用于 gem 迷阵游戏的改进匹配查找算法?

algorithm - 在现有的非重叠矩形之间安装一个矩形

algorithm - 无法实现死锁检测算法

algorithm - 改进的最短路径算法

Java - 提取方括号内的内容(忽略嵌套的方括号)?

python - 冒泡排序 - 变体(性能时间) - python

python - 生成所有组的固定长度组合