Step 1 / 18 Edge from node 0 to node 1 Edge from node 1 to node 2 Edge from node 3 to node 4 Edge from node 5 to node 6 Edge from node 6 to node 7 Edge from node 2 to node 3 Edge from node 4 to node 5 0 1 2 3 4 5 6 7 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 0 0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 op init x - y - root_x - root_y - step 0 Variables Initial state: 8 disjoint elements { 0 } , { 1 } , … , { 7 } \{0\}, \{1\}, \ldots, \{7\} { 0 } , { 1 } , … , { 7 } . Each element is its own parent, all ranks are 0.
Step 2 / 18 Edge from node 0 to node 1 Edge from node 1 to node 2 Edge from node 3 to node 4 Edge from node 5 to node 6 Edge from node 6 to node 7 Edge from node 2 to node 3 Edge from node 4 to node 5 0 1 2 3 4 5 6 7 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 0 0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 op Union(0,1) x 0 y 1 root_x 0 root_y 1 step 1 Variables Union(0, 1): Both roots have rank 0. Attach 1 under 0 and increment rank of 0.
Step 3 / 18 Edge from node 0 to node 1 Edge from node 1 to node 2 Edge from node 3 to node 4 Edge from node 5 to node 6 Edge from node 6 to node 7 Edge from node 2 to node 3 Edge from node 4 to node 5 0 1 2 3 4 5 6 7 0 0 0 1 2 2 3 3 4 4 5 5 6 6 7 7 Arrow from par.cell[0] to par.cell[1]: 0 is root 0 is root 1 0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 op Union(0,1) x 0 y 1 root_x 0 root_y 1 step 1 Variables After Union(0,1): p a r e n t [ 1 ] = 0 parent[1] = 0 p a re n t [ 1 ] = 0 , r a n k [ 0 ] = 1 rank[0] = 1 r ank [ 0 ] = 1 . Set { 0 , 1 } \{0, 1\} { 0 , 1 } formed with root 0.
Step 4 / 18 Edge from node 0 to node 1 Edge from node 1 to node 2 Edge from node 3 to node 4 Edge from node 5 to node 6 Edge from node 6 to node 7 Edge from node 2 to node 3 Edge from node 4 to node 5 0 1 2 3 4 5 6 7 0 0 0 1 2 2 3 3 4 4 5 5 6 6 7 7 Arrow from par.cell[0] to par.cell[1]: 0 is root 0 is root 1 0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 op Union(1,2) x 1 y 2 root_x 0 root_y 2 step 2 Variables Union(1, 2): Find(1) = 0 (rank 1), Find(2) = 2 (rank 0). Attach 2 under 0.
Step 5 / 18 Edge from node 0 to node 1 Edge from node 1 to node 2 Edge from node 3 to node 4 Edge from node 5 to node 6 Edge from node 6 to node 7 Edge from node 2 to node 3 Edge from node 4 to node 5 0 1 2 3 4 5 6 7 0 0 0 1 0 2 3 3 4 4 5 5 6 6 7 7 Arrow from par.cell[0] to par.cell[1]: 0 is root 0 is root 1 0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 op Union(1,2) x 1 y 2 root_x 0 root_y 2 step 2 Variables After Union(1,2): p a r e n t [ 2 ] = 0 parent[2] = 0 p a re n t [ 2 ] = 0 . Set { 0 , 1 , 2 } \{0, 1, 2\} { 0 , 1 , 2 } with root 0.
Step 6 / 18 Edge from node 0 to node 1 Edge from node 1 to node 2 Edge from node 3 to node 4 Edge from node 5 to node 6 Edge from node 6 to node 7 Edge from node 2 to node 3 Edge from node 4 to node 5 0 1 2 3 4 5 6 7 0 0 0 1 0 2 3 3 4 4 5 5 6 6 7 7 Arrow from par.cell[0] to par.cell[1]: 0 is root 0 is root 1 0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 op Union(3,4) x 3 y 4 root_x 3 root_y 4 step 3 Variables Union(3, 4): Both roots have rank 0. Attach 4 under 3 and increment rank of 3.
Step 7 / 18 Edge from node 0 to node 1 Edge from node 1 to node 2 Edge from node 3 to node 4 Edge from node 5 to node 6 Edge from node 6 to node 7 Edge from node 2 to node 3 Edge from node 4 to node 5 0 1 2 3 4 5 6 7 0 0 0 1 0 2 3 3 3 4 5 5 6 6 7 7 Arrow from par.cell[0] to par.cell[1]: 0 is root 0 is root Arrow from par.cell[3] to par.cell[4]: 3 is root 3 is root 1 0 0 1 0 2 1 3 0 4 0 5 0 6 0 7 op Union(3,4) x 3 y 4 root_x 3 root_y 4 step 3 Variables After Union(3,4): p a r e n t [ 4 ] = 3 parent[4] = 3 p a re n t [ 4 ] = 3 , r a n k [ 3 ] = 1 rank[3] = 1 r ank [ 3 ] = 1 . Set { 3 , 4 } \{3, 4\} { 3 , 4 } formed with root 3.
Step 8 / 18 Edge from node 0 to node 1 Edge from node 1 to node 2 Edge from node 3 to node 4 Edge from node 5 to node 6 Edge from node 6 to node 7 Edge from node 2 to node 3 Edge from node 4 to node 5 0 1 2 3 4 5 6 7 0 0 0 1 0 2 3 3 3 4 5 5 6 6 7 7 Arrow from par.cell[0] to par.cell[1]: 0 is root 0 is root Arrow from par.cell[3] to par.cell[4]: 3 is root 3 is root 1 0 0 1 0 2 1 3 0 4 0 5 0 6 0 7 op Union(5,6) x 5 y 6 root_x 5 root_y 6 step 4 Variables Union(5, 6): Both roots have rank 0. Attach 6 under 5 and increment rank of 5.
Step 9 / 18 Edge from node 0 to node 1 Edge from node 1 to node 2 Edge from node 3 to node 4 Edge from node 5 to node 6 Edge from node 6 to node 7 Edge from node 2 to node 3 Edge from node 4 to node 5 0 1 2 3 4 5 6 7 0 0 0 1 0 2 3 3 3 4 5 5 5 6 7 7 Arrow from par.cell[0] to par.cell[1]: 0 is root 0 is root Arrow from par.cell[3] to par.cell[4]: 3 is root 3 is root 1 0 0 1 0 2 1 3 0 4 1 5 0 6 0 7 op Union(5,6) x 5 y 6 root_x 5 root_y 6 step 4 Variables After Union(5,6): p a r e n t [ 6 ] = 5 parent[6] = 5 p a re n t [ 6 ] = 5 , r a n k [ 5 ] = 1 rank[5] = 1 r ank [ 5 ] = 1 . Set { 5 , 6 } \{5, 6\} { 5 , 6 } formed with root 5.
Step 10 / 18 Edge from node 0 to node 1 Edge from node 1 to node 2 Edge from node 3 to node 4 Edge from node 5 to node 6 Edge from node 6 to node 7 Edge from node 2 to node 3 Edge from node 4 to node 5 0 1 2 3 4 5 6 7 0 0 0 1 0 2 3 3 3 4 5 5 5 6 7 7 Arrow from par.cell[0] to par.cell[1]: 0 is root 0 is root Arrow from par.cell[3] to par.cell[4]: 3 is root 3 is root 1 0 0 1 0 2 1 3 0 4 1 5 0 6 0 7 op Union(6,7) x 6 y 7 root_x 5 root_y 7 step 5 Variables Union(6, 7): Find(6) = 5 (rank 1), Find(7) = 7 (rank 0). Attach 7 under 5.
Step 11 / 18 Edge from node 0 to node 1 Edge from node 1 to node 2 Edge from node 3 to node 4 Edge from node 5 to node 6 Edge from node 6 to node 7 Edge from node 2 to node 3 Edge from node 4 to node 5 0 1 2 3 4 5 6 7 0 0 0 1 0 2 3 3 3 4 5 5 5 6 5 7 Arrow from par.cell[0] to par.cell[1]: 0 is root 0 is root Arrow from par.cell[3] to par.cell[4]: 3 is root 3 is root 1 0 0 1 0 2 1 3 0 4 1 5 0 6 0 7 op Union(6,7) x 6 y 7 root_x 5 root_y 7 step 5 Variables After Union(6,7): p a r e n t [ 7 ] = 5 parent[7] = 5 p a re n t [ 7 ] = 5 . Set { 5 , 6 , 7 } \{5, 6, 7\} { 5 , 6 , 7 } with root 5.
Step 12 / 18 Edge from node 0 to node 1 Edge from node 1 to node 2 Edge from node 3 to node 4 Edge from node 5 to node 6 Edge from node 6 to node 7 Edge from node 2 to node 3 Edge from node 4 to node 5 0 1 2 3 4 5 6 7 0 0 0 1 0 2 3 3 3 4 5 5 5 6 5 7 Arrow from par.cell[0] to par.cell[1]: 0 is root 0 is root Arrow from par.cell[3] to par.cell[4]: 3 is root 3 is root rank tie! 1 0 0 1 0 2 1 3 0 4 1 5 0 6 0 7 op Union(2,3) x 2 y 3 root_x 0 root_y 3 step 6 Variables Union(2, 3): Find(2) = 0 (rank 1), Find(3) = 3 (rank 1). Equal ranks! Attach 3 under 0, increment rank of 0.
Step 13 / 18 Edge from node 0 to node 1 Edge from node 1 to node 2 Edge from node 3 to node 4 Edge from node 5 to node 6 Edge from node 6 to node 7 Edge from node 2 to node 3 Edge from node 4 to node 5 0 1 2 3 4 5 6 7 0 0 0 1 0 2 0 3 3 4 5 5 5 6 5 7 Arrow from par.cell[0] to par.cell[1]: 0 is root 0 is root Arrow from par.cell[3] to par.cell[4]: 3 is root 3 is root rank tie! 2 0 0 1 0 2 1 3 0 4 1 5 0 6 0 7 op Union(2,3) x 2 y 3 root_x 0 root_y 3 step 6 Variables After Union(2,3): p a r e n t [ 3 ] = 0 parent[3] = 0 p a re n t [ 3 ] = 0 , r a n k [ 0 ] = 2 rank[0] = 2 r ank [ 0 ] = 2 . Set { 0 , 1 , 2 , 3 , 4 } \{0,1,2,3,4\} { 0 , 1 , 2 , 3 , 4 } with root 0.
Step 14 / 18 Edge from node 0 to node 1 Edge from node 1 to node 2 Edge from node 3 to node 4 Edge from node 5 to node 6 Edge from node 6 to node 7 Edge from node 2 to node 3 Edge from node 4 to node 5 0 1 2 3 4 5 6 7 0 0 0 1 0 2 0 3 3 4 5 5 5 6 5 7 Arrow from par.cell[0] to par.cell[1]: 0 is root 0 is root Arrow from par.cell[3] to par.cell[4]: 3 is root 3 is root rank tie! 2 0 0 1 0 2 1 3 0 4 1 5 0 6 0 7 op Union(4,5) x 4 y 5 root_x 0 root_y 5 step 7 Variables Union(4, 5): Find(4) → \rightarrow → 3 → \rightarrow → 0 (rank 2), Find(5) = 5 (rank 1). Attach 5 under 0. Path compression on Find(4)!
Step 15 / 18 Edge from node 0 to node 1 Edge from node 1 to node 2 Edge from node 3 to node 4 Edge from node 5 to node 6 Edge from node 6 to node 7 Edge from node 2 to node 3 Edge from node 4 to node 5 0 1 2 3 4 5 6 7 0 0 0 1 0 2 0 3 0 4 0 5 5 6 5 7 Arrow from par.cell[0] to par.cell[1]: 0 is root 0 is root Arrow from par.cell[3] to par.cell[4]: 3 is root 3 is root rank tie! compressed! 2 0 0 1 0 2 1 3 0 4 1 5 0 6 0 7 op Union(4,5) x 4 y 5 root_x 0 root_y 5 step 7 Variables After Union(4,5): p a r e n t [ 5 ] = 0 parent[5] = 0 p a re n t [ 5 ] = 0 . Path compression: p a r e n t [ 4 ] parent[4] p a re n t [ 4 ] updated from 3 to 0 directly. All 8 elements now in one set!
Step 16 / 18 Edge from node 0 to node 1 Edge from node 1 to node 2 Edge from node 3 to node 4 Edge from node 5 to node 6 Edge from node 6 to node 7 Edge from node 2 to node 3 Edge from node 4 to node 5 0 1 2 3 4 5 6 7 0 0 0 1 0 2 0 3 0 4 0 5 5 6 5 7 Arrow from par.cell[0] to par.cell[1]: 0 is root 0 is root Arrow from par.cell[3] to par.cell[4]: 3 is root 3 is root rank tie! compressed! 2 0 0 1 0 2 1 3 0 4 1 5 0 6 0 7 op Find(7) x 7 y - root_x 0 root_y - step 8 Variables Find(7): traverse 7 → 5 → 0 7 \rightarrow 5 \rightarrow 0 7 → 5 → 0 . Root is 0. Now apply path compression.
Step 17 / 18 Edge from node 0 to node 1 Edge from node 1 to node 2 Edge from node 3 to node 4 Edge from node 5 to node 6 Edge from node 6 to node 7 Edge from node 2 to node 3 Edge from node 4 to node 5 0 1 2 3 4 5 6 7 0 0 0 1 0 2 0 3 0 4 0 5 5 6 0 7 Arrow from par.cell[0] to par.cell[1]: 0 is root 0 is root Arrow from par.cell[3] to par.cell[4]: 3 is root 3 is root rank tie! compressed! compressed! 2 0 0 1 0 2 1 3 0 4 1 5 0 6 0 7 op Find(7) x 7 y - root_x 0 root_y - step 8 Variables Path compression: p a r e n t [ 7 ] parent[7] p a re n t [ 7 ] updated from 5 to 0. Future Find(7) returns in O ( 1 ) O(1) O ( 1 ) .
Step 18 / 18 Edge from node 0 to node 1 Edge from node 1 to node 2 Edge from node 3 to node 4 Edge from node 5 to node 6 Edge from node 6 to node 7 Edge from node 2 to node 3 Edge from node 4 to node 5 0 1 2 3 4 5 6 7 0 0 0 1 0 2 0 3 0 4 0 5 5 6 0 7 Arrow from par.cell[0] to par.cell[1]: 0 is root 0 is root Arrow from par.cell[3] to par.cell[4]: 3 is root 3 is root rank tie! compressed! compressed! 2 0 0 1 0 2 1 3 0 4 1 5 0 6 0 7 op done x 7 y - root_x 0 root_y - step done Variables Final state: all 8 nodes belong to one set with root 0. The p a r e n t [ ] parent[] p a re n t [ ] array is nearly flat thanks to path compression.