mirror of
https://github.com/TheAlgorithms/Java.git
synced 2025-12-19 07:00:35 +08:00
testing: improve DisjointSetUnionTest (#6440)
* testing: improve DisjointSetUnionTest * testing: redundant variable for DisjointSetUnionTest
This commit is contained in:
committed by
GitHub
parent
040d3850ac
commit
032f75c0f4
@@ -122,4 +122,109 @@ public class DisjointSetUnionTest {
|
||||
assertEquals(root, node1);
|
||||
assertEquals(node1, node3.parent);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUnionByRankSmallerToLarger() {
|
||||
DisjointSetUnion<Integer> dsu = new DisjointSetUnion<>();
|
||||
Node<Integer> node1 = dsu.makeSet(1);
|
||||
Node<Integer> node2 = dsu.makeSet(2);
|
||||
Node<Integer> node3 = dsu.makeSet(3);
|
||||
|
||||
// Create tree with node1 as root and rank 1
|
||||
dsu.unionSets(node1, node2);
|
||||
assertEquals(1, node1.rank);
|
||||
assertEquals(0, node2.rank);
|
||||
|
||||
// Union single node (rank 0) with tree (rank 1)
|
||||
// Smaller rank tree should attach to larger rank tree
|
||||
dsu.unionSets(node3, node1);
|
||||
assertEquals(node1, dsu.findSet(node3));
|
||||
assertEquals(1, node1.rank); // Rank should not increase
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUnionByRankEqualRanks() {
|
||||
DisjointSetUnion<Integer> dsu = new DisjointSetUnion<>();
|
||||
Node<Integer> node1 = dsu.makeSet(1);
|
||||
Node<Integer> node2 = dsu.makeSet(2);
|
||||
Node<Integer> node3 = dsu.makeSet(3);
|
||||
Node<Integer> node4 = dsu.makeSet(4);
|
||||
|
||||
// Create two trees of equal rank (1)
|
||||
dsu.unionSets(node1, node2);
|
||||
dsu.unionSets(node3, node4);
|
||||
assertEquals(1, node1.rank);
|
||||
assertEquals(1, node3.rank);
|
||||
|
||||
// Union two trees of equal rank
|
||||
dsu.unionSets(node1, node3);
|
||||
Node<Integer> root = dsu.findSet(node1);
|
||||
assertEquals(2, root.rank); // Rank should increase by 1
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLargeChainPathCompression() {
|
||||
DisjointSetUnion<Integer> dsu = new DisjointSetUnion<>();
|
||||
Node<Integer> node1 = dsu.makeSet(1);
|
||||
Node<Integer> node2 = dsu.makeSet(2);
|
||||
Node<Integer> node3 = dsu.makeSet(3);
|
||||
Node<Integer> node4 = dsu.makeSet(4);
|
||||
Node<Integer> node5 = dsu.makeSet(5);
|
||||
|
||||
// Create a long chain: 1 -> 2 -> 3 -> 4 -> 5
|
||||
dsu.unionSets(node1, node2);
|
||||
dsu.unionSets(node2, node3);
|
||||
dsu.unionSets(node3, node4);
|
||||
dsu.unionSets(node4, node5);
|
||||
|
||||
// Find from the deepest node
|
||||
Node<Integer> root = dsu.findSet(node5);
|
||||
|
||||
// Path compression should make all nodes point directly to root
|
||||
assertEquals(root, node5.parent);
|
||||
assertEquals(root, node4.parent);
|
||||
assertEquals(root, node3.parent);
|
||||
assertEquals(root, node2.parent);
|
||||
assertEquals(root, node1.parent);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMultipleDisjointSets() {
|
||||
DisjointSetUnion<Integer> dsu = new DisjointSetUnion<>();
|
||||
Node<Integer> node1 = dsu.makeSet(1);
|
||||
Node<Integer> node2 = dsu.makeSet(2);
|
||||
Node<Integer> node3 = dsu.makeSet(3);
|
||||
Node<Integer> node4 = dsu.makeSet(4);
|
||||
Node<Integer> node5 = dsu.makeSet(5);
|
||||
Node<Integer> node6 = dsu.makeSet(6);
|
||||
|
||||
// Create two separate components
|
||||
dsu.unionSets(node1, node2);
|
||||
dsu.unionSets(node2, node3);
|
||||
|
||||
dsu.unionSets(node4, node5);
|
||||
dsu.unionSets(node5, node6);
|
||||
|
||||
// Verify they are separate
|
||||
assertEquals(dsu.findSet(node1), dsu.findSet(node2));
|
||||
assertEquals(dsu.findSet(node2), dsu.findSet(node3));
|
||||
assertEquals(dsu.findSet(node4), dsu.findSet(node5));
|
||||
assertEquals(dsu.findSet(node5), dsu.findSet(node6));
|
||||
|
||||
assertNotEquals(dsu.findSet(node1), dsu.findSet(node4));
|
||||
assertNotEquals(dsu.findSet(node3), dsu.findSet(node6));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEmptyValues() {
|
||||
DisjointSetUnion<String> dsu = new DisjointSetUnion<>();
|
||||
Node<String> emptyNode = dsu.makeSet("");
|
||||
Node<String> nullNode = dsu.makeSet(null);
|
||||
|
||||
assertEquals(emptyNode, dsu.findSet(emptyNode));
|
||||
assertEquals(nullNode, dsu.findSet(nullNode));
|
||||
|
||||
dsu.unionSets(emptyNode, nullNode);
|
||||
assertEquals(dsu.findSet(emptyNode), dsu.findSet(nullNode));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user