1

「基本に立ち返る」旅行の一環として、この方法を検討していますが、恥ずかしいほど明白なものが欠落しているか、whileここで演算子は必要ありません。

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

完全なソースはここにあります。

これと同じくらい単純なように見えます(そして関数全体はかなり無意味です):

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

3 に答える 3

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
于 2012-09-07T07:27:44.863 に答える
2

が与えられると// id[i] = parent of i、このループは最上位の祖先を見つけます。これはコンポーネント識別子と見なされます。それ以外の場合、plainはのid[p]親であり、あなたのステートメントは、前述の最上位の祖先でpある場合にのみ正しいものになります。p

于 2012-09-07T07:23:58.207 に答える
0

private int [] id; // id [i]=iの親

それは説明の一番上にあるので、id[p]はwhileループと同じではありません

于 2012-09-07T07:26:24.440 に答える