Quick-Union

Quick-Union


 1/**
 2 * @author wangy
 3 * @version 1.0
 4 * @date 2023/5/22 / 08:59
 5 */
 6public class QuickUnion {
 7
 8    public static void main(String[] args) {
 9        QuickUnionUF uf = new QuickUnionUF(10);
10        uf.union(4, 3);
11        uf.union(3, 8);
12        uf.union(6, 5);
13        uf.print();
14        StdOut.println(uf.find(4, 8));
15        StdOut.println(uf.find(3, 9));
16        uf.union(9, 4);
17        uf.union(2, 1);
18        uf.union(5, 0);
19        uf.print();
20        uf.union(7, 2);
21        uf.union(6, 1);
22        uf.union(7, 3);
23        uf.print();
24        StdOut.println(uf.find(2,9));
25    }
26}
27
28
29class QuickUnionUF {
30    private int[] id;
31
32    QuickUnionUF(int N) {
33        id = new int[N];
34        for (int i = 0; i < N; i++) {
35            id[i] = i;
36        }
37    }
38
39    // chase parent pointers until reach root
40    // depth of i array access
41    private int root(int p) {
42        while (id[p] != p) {
43            p = id[p];
44        }
45        return p;
46    }
47
48    // check p and q have the same root
49    // depth of p and q array accesses
50    public boolean find(int p, int q) {
51        return root(p) == root(q);
52    }
53
54    // change root of p to point to root of q
55    // depth of p and q array access
56    public void union(int p, int q) {
57        int rp = root(p);
58        int rq = root(q);
59        id[rp] = rq;
60    }
61
62    public void print() {
63        StdOut.println(Arrays.toString(id));
64    }
65}
66
67