diff --git a/content/posts/2024-06-24-union-find/index.md b/content/posts/2024-06-24-union-find/index.md index 04fcfd5..42bd085 100644 --- a/content/posts/2024-06-24-union-find/index.md +++ b/content/posts/2024-06-24-union-find/index.md @@ -24,3 +24,27 @@ operations: `ds.union(lhs, rhs)` and `ds.find(elem)`. [series]: {{< ref "/series/lesser-known-algorithms-and-data-structures/">}} + +## What does it do? + +The _Union-Find_ data structure allows one to store a collection of sets of +elements, with operations for adding new sets, merging two sets into one, and +finding the representative member of a set. Not only does it do all that, but it +does it in almost constant (amortized) time! + +Here is a small motivating example for using the _Disjoint Set_ data structure: + +```python +def connected_components(graph: Graph) -> list[set[Node]]: + # Initialize the disjoint set so that each node is in its own set + ds: DisjointSet[Node] = DisjointSet(graph.nodes) + # Each edge is a connection, merge both sides into the same set + for (start, dest) in graph.edges: + ds.union(start, dest) + # Connected components share the same (arbitrary) root + components: dict[Node, set[Node]] = defaultdict(set) + for n in graph.nodes: + components[ds.find(n)].add(n) + # Return a list of disjoint sets corresponding to each connected component + return list(components.values()) +```