Union-find
1
Union-find
• Maintain a collection of disjoint sets
under the following two operations
• S3 = Union(S1,S2)
• Find(x) : returns the set containing x
2
Union-find
• We assume there are n fixed
elements
• We start with n sets each containing
a single element
• Each element has a pointer to its
representation in the set containing it
3
S1 = {e1} S2 = {e2} S3={e3} S4={e4} ……
A = Union(S3,S4)
S1 = {e1} A= {e2,e3} S4={e4} ……
Find(e2) A
B = Union(A,S7)
S1 = {e1} B= {e2,e3,e7} S4={e4} ……
4
Why ?
• Suppose we want to maintain an
equivalence relation:
y
z
b
v
t
x
s
a
y≡z
5
y, z
t
x
b
v
s
a
y≡s
6
y, z, s
t
b
x
v
a
y≡s
7
Queries
• Equivalent?(y,a)
8
Can solve this with union-find
• Each equivalence class is a set
• y ≡ s union(find(y),find(s))
• Equivalent?(y,a)
return yes if find(y) = find(a)
9
Representation
• Represent each set by a tree, each
node represents an item, the root
also represents the set
B
e2
e7
e3
10
Concretely
B
e2
e7
e3
11
Find(e10)
C
e6
e9
e11
e10
e8
12
Find(e10)
C
e6
e9
e11
e10
e8
Find(x)
while (x.parent ≠null) do x ← x.parent
return (x)
13
D=Union(B,C)
C e6
e2 B
e7
e3
e9
e11
e10
e8
14
D=Union(B,C)
C e6
e2 B
e7
e3
e9
e11
e10
e8
15
D=Union(B,C)
D e6
e2 B
e7
e3
e9
e11
e10
e8
16
D=Union(B,C)
e2 B
e7
C e6
e3
e9
e11
e10
e8
17
D=Union(B,C)
e2 B
e7
C e6
e3
e9
e11
e10
e8
18
D=Union(B,C)
e2 D
e7
C e6
e3
e9
e11
e10
e8
19
Link by size
• For the find’s sake its better to hang
the smaller on the larger
20
D=Union(B,C)
C e6 5
3 e2 B
e7
e3
e9
e11
e10
e8
If (C.size > B.size) then
B.Parent ← C; C.size = C.size + B.size
return (C)
Else C.parent ← B; B.size = B.size + C.size
return (B)
21
D=Union(B,C)
D
C e6 8
3 e2 B
e7
e3
e9
e11
e10
e8
If (C.size > B.size) then
B.Parent ← C; C.size = C.size + B.size
return (C)
Else C.parent ← B; B.size = B.size + C.size
return (B)
22
Analysis
• Union: O(1) time
• Find: O(log(n)) time
• The depth of a tree is at most log(n)
23
Proof
By induction on the
sequence of operations:
For every x
Depth(x) ≤ log |T(x)|
x
24
Path compression
25
© Copyright 2026 Paperzz