L'Union Find, également connu sous le nom de Disjoint Set Union (DSU), est une structure de données efficace pour gérer des ensembles disjoints et déterminer si des éléments appartiennent au même sous-ensemble.
Le Union Find est utilisé pour suivre et gérer la partition d'un ensemble d'éléments en sous-ensembles disjoints. Il prend en charge deux opérations principales :
Imaginez des aimants qui se connectent pour former des groupes distincts. Chaque groupe d'aimants représente un sous-ensemble. En utilisant Union Find, nous pouvons gérer ces regroupements et déterminer si deux aimants sont connectés dans le même sous-ensemble.
Union Find est utilisé dans divers domaines en informatique :
L'algorithme de Kruskal utilise Union Find pour éviter les cycles lors de la construction d'un arbre couvrant minimal dans un graphe pondéré :
Avec des optimisations comme la compression de chemin et l'union par rang, les opérations Union et Find ont une complexité presque constante, notée O(α(n)), oùα(n) est l'inverse de la fonction d'Ackermann, qui croît extrêmement lentement.
Voici une implémentation de Union Find avec compression de chemin et union par rang :
class UnionFind:
def __init__(self, size):
self.root = [i for i in range(size)]
self.rank = [1] * size # Initialisation du rang de chaque nœud à 1
# Find avec compression de chemin
def find(self, x):
if self.root[x] != x:
self.root[x] = self.find(self.root[x]) # Compression de chemin
return self.root[x]
# Union avec union par rang
def union(self, x, y):
rootX = self.find(x)
rootY = self.find(y)
if rootX != rootY:
if self.rank[rootX] > self.rank[rootY]:
self.root[rootY] = rootX
elif self.rank[rootX] < self.rank[rootY]:
self.root[rootX] = rootY
else:
self.root[rootY] = rootX
self.rank[rootX] += 1
# Vérification si deux éléments sont connectés
def connected(self, x, y):
return self.find(x) == self.find(y)
# Exemple d'utilisation de Union Find
uf = UnionFind(10)
uf.union(1, 2)
uf.union(2, 3)
print(uf.connected(1, 3)) # Sortie : True
print(uf.connected(1, 4)) # Sortie : False
Explication du Code :
Testez vos connaissances avec ces exercices :
# Exercices :
# 1. Implémentez une fonction pour compter le nombre de sous-ensembles disjoints dans un ensemble donné.
# 2. Utilisez Union Find pour détecter des cycles dans un graphe non orienté.
# 3. Implémentez l'algorithme de Kruskal pour trouver l'arbre couvrant minimal d'un graphe pondéré.
# 4. Modifiez l'implémentation pour prendre en charge les caractères ou des objets comme éléments.
# 5. Créez une fonction qui trouve le plus grand sous-ensemble disjoint dans un ensemble donné.
L'Union Find est une structure de données puissante pour gérer des ensembles disjoints et est essentielle dans de nombreux algorithmes avancés. Avec des optimisations comme la compression de chemin et l'union par rang, il offre des performances presque constantes pour les opérations critiques.