Some applications involve grouping distinct objects into a collection of disjoint sets. Two important operations are then finding which set a given object belongs to and uniting the two sets.
A disjoint set data structure maintains a collection of disjoint dynamic sets. Each set is identified by a representative, which usually is a member in the set.
1 Operations on Sets
Let be an object. We wish to support the following operations.
- Make-Set( ) creates a new set whose only member is pointed by ; Note that is not in the other sets.
- Union( ) unites two dynamic sets containing objects and , say and , into a new set that , assuming that ;
- Find-Set( ) returns a pointer to the representative of the set containing .
- Insert( ) inserts an object to , and returns .
- Delete( ) deletes an object from , and returns .
- Split( ) partitions the objects of into two sets and such that , and .
- Minimum( ) returns the minimum object in .
2 Applications of Disjoint-set Data Structures
Here we show two application examples.
- Connected components (CCs)
- Minimum Spanning Trees (MSTs)
2.1 Algorithm for Connected Components
Connected-Components 1 for each 2 do Make-Set 3 for every edge 4 do if Find-Set Find-Set 5 then Union
Same-Components 1 if Find-Set Find-Set 2 then return TRUE 3 return FALSE

Figure 1: A graph with four connected components: , , , and .
| Edge processed | Collection of disjoint sets | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| initial sets | ||||||||||
Table 1: This table shows the state of the collection of disjoint sets as each edge is processed. The processed edge is listed on the left and the rest of the columns show the state of the collection.
3 The Disjoint Set Representation
3.1 The Linked-list Representation
A set can be represented by a linked list. In this representation, each node has a pointer to the next node and a pointer to the first node.

Figure 2: Linked-list representation. Each disjoint set can be represented by a linked-list. Each node has a pointer to the head node and a pointer to the next node.
Consider the following operation sequence:
Make-Set ,
Make-Set ,
,
Make-Set ,
Make-Set ,
Union ,
Union ,
,
Union .
What's the total time complexity of the above operations?
A weighted-union heuristic: Assume that the representative of each set maintains the number of objects in the set, and always merge the smaller list to the larger list, then
Theorem: Using the linked list representation of disjoint sets and the weighted-union heuristic, a sequence of Make-Set, Union, and Find_Set operations, of which are Make-Set, takes time.
Hint: observe that for any , after 's representative pointer has been updated times, the resulting set containing must have at least members.
4 Disjoint Set Forests
A faster implementation of disjoint sets is through the rooted trees, with each node containing one member and each tree representing one set. Each member in the tree has only one parent.

Figure 3: Rooted tree representation of disjoint sets. Each tree has a "representative" for the left tree and for the right tree.
4.1 The Heuristics for Disjoint Set Operations
- union by rank.
- path compression
The idea of union by rank is to make the root of the tree with fewer nodes point to the root of the tree with more nodes. Rather than explicitly keeping track of the size of the subtree rooted at each node, for each node we maintain a rank that approximates the logarithm of the subtree size and is also an upper bound on the height of the node.
Time complexity: , assuming that there are union operations.
Path compression is quite simple and very effective. We use this approach during Find-Set operations to make each node on the path point directly to the root. Path compression does not change any ranks.

Figure 4: Path compression takes place during the Find-Set operation. This works by recursing from the given input node up to the root of the tree, forming a path. Then the root is returned and assigned as the parent for each node in path. The parent of after Find-Set is .
Time complexity: if and otherwise, assume that there are Make-Set operations and Find-Set operations.
Make-Set
1
2
Find-Set 1 if 2 then Find-Set 3 return
Union 1 Link( Find-Set , Find-Set )
Link
1 if
2 then
3 else
4 if
5 then
where is the height of in the tree. If both of the above methods are used together, the time complexity is .
The Rank properties
- for any tree root , (Link operation)
- for any integer , there are at most nodes of rank
- each node has rank at most , assuming there are at objects involved.
Where union-find is used
Union-find is a small structure with an unusually wide reach, because "these two things are now in the same group, and stay there" describes a great many problems. With union by rank and path compression, a sequence of m operations costs O(m α(n)), where α is the inverse Ackermann function — below 5 for any n that will ever be stored, so each operation is effectively constant time.
- Minimum spanning trees. Kruskal's algorithm is union-find plus a sort: walk the edges cheapest first, and take an edge exactly when its endpoints are still in different sets. Without this structure the cycle test would dominate the running time.
- Connectivity. Which machines can reach each other, which pixels belong to the same blob, whether a network is still in one piece after a link is added. Union-find answers this as the edges arrive, without re-running a search.
- Image segmentation. The Felzenszwalb-Huttenlocher segmentation algorithm is essentially Kruskal over a pixel grid, merging regions while a similarity predicate holds.
- Compilers and type systems. Hindley-Milner type inference unifies type variables by merging equivalence classes. Register allocators coalesce registers the same way, and congruence closure in SMT solvers merges terms known to be equal.
- Equivalence and closure problems generally: minimising a finite automaton by merging indistinguishable states, grouping records that refer to the same real entity, maintaining equivalence classes in a constraint solver.
- Percolation and physics simulation, where the question is whether a cluster has grown across the whole grid, and the Hoshen-Kopelman labelling algorithm is union-find in disguise.
- Maze generation, knocking down walls between cells that are not yet connected, and offline lowest common ancestor queries via Tarjan's algorithm.
The one thing it cannot do is undo. Union-find merges sets and never splits them, so a problem with edge deletions needs something else — which is why algorithms are often restructured to process deletions backwards in time, turning them into insertions.