25
1 Union-find

1 Union-find. 2 Maintain a collection of disjoint sets under the following two operations S 3 = Union(S 1,S 2 ) Find(x) : returns the set containing x

Embed Size (px)

Citation preview

1

Union-find

2

Union-find

• Maintain a collection of disjoint sets under the following two operations

• S3 = Union(S1,S2)

• Find(x) : returns the set containing x

3

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

4

S1 = {e1} S2 = {e2} S3={e3} S4={e4} ……

S1 = {e1} A= {e2,e3} S4={e4} ……

A = Union(S3,S4)

Find(e2) A

B = Union(A,S7)

S1 = {e1} B= {e2,e3,e7} S4={e4} ……

5

Why ?

• Suppose we want to maintain an equivalence relation:

y z

t x

b v

s a

y ≡ z

6

y, z

t x

b v

s a

y ≡ s

7

y, z, s

t x

b v

a

y ≡ s

8

Queries

• Equivalent?(y,a)

9

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)

10

e2

Representation

• Represent each set by a tree, each node represents an item, the root also represents the set

e3e7

B

11

Concretely

e3e7

e2B

12

Find(e10)

e6

e9e11

e8e10

C

13

Find(e10)

e6

e9e11

e8e10

Find(x)

while (x.parent ≠null) do x ← x.parentreturn (x)

C

14

D=Union(B,C)

Be2

e3e7

C e6

e9e11

e8e10

15

D=Union(B,C)

Be2

e3e7

C e6

e9e11

e8e10

16

D=Union(B,C)

Be2

e3e7

D e6

e9e11

e8e10

17

D=Union(B,C)

Be2

e3e7 C e6

e9e11

e8e10

18

D=Union(B,C)

Be2

e3e7 C e6

e9e11

e8e10

19

D=Union(B,C)

De2

e3e7 C e6

e9e11

e8e10

20

Link by size

• For the find’s sake its better to hang the smaller on the larger

21

D=Union(B,C)

Be2

e3e7

C e6

e9e11

e8e10

5

3

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

D=Union(B,C)

Be2

e3e7

C e6

e9e11

e8e10

8

3

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)

D

23

Analysis

• Union: O(1) time• Find: O(log(n)) time

• The depth of a tree is at most log(n)

24

Proof

By induction on the sequence of operations:

For every x

Depth(x) ≤ log |T(x)|

x

25

Path compression