Data Structure - Disjoint Set
Data Structure - Disjoint Set
Overview
Operation Union
Operation Find
Applications
Kruskal Minimum Spanning Tree algorithm Finding Connected Components in Graph etc
How to implement?
#define MAX_N 1000 // as needed int pset[MAX_N]; void initSet(){ for(int i = 0; i < MAX_N; i++) pset[i] = i; } int findSet(int i){ return (pset[i] == i) ? i : (pset[i] = findSet(pset[i])); } void unionSet(int i, int j){ pset[findSet(i)] = findSet(j); } int sameSet(int i, int j){ return findSet(i) == findSet(j); }
Parent = A
Parent = B
Parent = C
Parent = D
Parent = E
unionSet(A, B)
#define MAX_N 1000 // as needed int pset[MAX_N]; void initSet(){ for(int i = 0; i < MAX_N; i++) pset[i] = i; } int findSet(int i){ return (pset[i] == i) ? i : (pset[i] = findSet(pset[i])); } void unionSet(int i, int j){ pset[findSet(i)] = findSet(j); } int sameSet(int i, int j){ return findSet(i) == findSet(j); }
Parent = B
Now both A and B become one set, identified by both nodes having the same parent ID
Parent = B
B A
Parent = C
Parent = D
Parent = E
unionSet(A, C)
#define MAX_N 1000 // as needed int pset[MAX_N]; void initSet(){ for(int i = 0; i < MAX_N; i++) pset[i] = i; } int findSet(int i){ return (pset[i] == i) ? i : (pset[i] = findSet(pset[i])); } void unionSet(int i, int j){ pset[findSet(i)] = findSet(j); } int sameSet(int i, int j){ return findSet(i) == findSet(j); } Parent = C
Parent = C
C B
Now both A, B, C become one set, identified by all three nodes having the same parent ID
Parent = D
Parent = B
Parent = E
unionSet(D, B)
#define MAX_N 1000 // as needed int pset[MAX_N]; void initSet(){ for(int i = 0; i < MAX_N; i++) pset[i] = i; } int findSet(int i){ return (pset[i] == i) ? i : (pset[i] = findSet(pset[i])); } void unionSet(int i, int j){ pset[findSet(i)] = findSet(j); } int sameSet(int i, int j){ return findSet(i) == findSet(j); } Parent = C
Parent = C
C B
Parent = C
Parent = B
Parent = E
findSet(A)
#define MAX_N 1000 // as needed int pset[MAX_N]; void initSet(){ for(int i = 0; i < MAX_N; i++) pset[i] = i; } int findSet(int i){ return (pset[i] == i) ? i : (pset[i] = findSet(pset[i])); } void unionSet(int i, int j){ pset[findSet(i)] = findSet(j); } int sameSet(int i, int j){ return findSet(i) == findSet(j); } Parent = C
Parent = C
C B
Parent = C
D
A
Parent = E
sameSet(A, E)
#define MAX_N 1000 // as needed int pset[MAX_N]; void initSet(){ for(int i = 0; i < MAX_N; i++) pset[i] = i; } int findSet(int i){ return (pset[i] == i) ? i : (pset[i] = findSet(pset[i])); } void unionSet(int i, int j){ pset[findSet(i)] = findSet(j); } int sameSet(int i, int j){ return findSet(i) == findSet(j); } Parent = C
Parent = C
C B
Parent = C
D
A
Parent = E
Parent = C
Further Reference:
Introductions to Algorithms, p505-509, ch21.3 Algorithm Design, p151-157, ch4.6