为什么在普林斯顿的这个加权快速联盟实施中使用“while”

时间:2012-09-07 07:19:01

标签: java algorithm

作为我“回归基础”之旅的一部分,我正在研究这种方法,我要么缺少一些令人尴尬的东西,要么在这里不需要while运算符:

// Return component identifier for component containing p
public int find(int p) {
    while (p != id[p])
        p = id[p];
    return p;
}

完整来源为here

看起来它可以像这样简单(并且整个功能毫无意义):

public int find(int p) {
    return id[p];
}

3 个答案:

答案 0 :(得分:3)

实际上不是。

它会将数组从指针移到指针,直到指针等于元素id。

示例:

id = [ 2 0 3 3 ]

然后,find(1)会执行以下操作:

id[1] = 0 != 1
id[0] = 2 != 0
id[2] = 3 != 2
id[3] = 3 == 3 => return 3

答案 1 :(得分:2)

给定// id[i] = parent of i,此循环找到最顶端的祖先,它被视为组件标识符。否则,普通id[p]p的父级,并且您的语句仅对p作为所述最顶级祖先的正确。

答案 2 :(得分:0)

private int [] id; // id [i] =我的父母

那是在desciption的顶部,所以id [p]与while循环不同