A disjoint-set data structure, also known as a union-find data structure, is a data structure that keeps track of a set of elements partitioned into a number of disjoint (non-overlapping) subsets. It supports two main operations:
find(x): returns the representative element (also known as the root) of the subset that contains element x.union(x, y): combines the subsets that contain elements x and y into a single subset.Here is an example of how you can implement a disjoint-set data structure in Java:
import java.util.HashMap;
import java.util.Map;
class DisjointSet {
private Map<Integer, Node> map = new HashMap<>();
// Inner class to represent a node in the disjoint-set
class Node {
int data;
Node parent;
int rank;
}
// Makes a set with only one element and returns its representative
public int makeSet(int data) {
Node node = new Node();
node.data = data;
node.parent = node;
node.rank = 0;
map.put(data, node);
return node.data;
}
// Finds the representative of the set that x belongs to
public int findSet(int data) {
return findSet(map.get(data)).data;
}
// Finds the representative recursively and does path
// compression as well
private Node findSet(Node node) {
Node parent = node.parent;
if (parent == node) {
return parent;
}
node.parent = findSet(node.parent);
return node.parent;
}
// Unites the set that includes x and the set that includes y
// Based on rank
public void union(int data1, int data2) {
Node node1 = map.get(data1);
Node node2 = map.get(data2);
Node parent1 = findSet(node1);
Node parent2 = findSet(node2);
// If they are part of the same set, do nothing
if (parent1.data == parent2.data) {
return;
}
// Else, whoever has a higher rank becomes the parent
if (parent1.rank >= parent2.rank) {
// Increment rank only if both sets have the same rank
parent1.rank = (parent1.rank == parent2.rank) ? parent1.rank + 1