Dans cette vidéo je vous propose de découvrir une nouvelle structure de données : le "Union-Find" qui permet de travailler sur des groupes disjoint. Pour vous donner un cas concret j'ai créé sur mon site un système permettant de faire le lien entre mes vidéos et j'aimerais obtenir quelques informations sur certains de mes noeuds :
- Combien de formations concernent le backend
- Est-ce que 2 technologies sont dans la même catégorie
- Est-ce que j'ai des groupes orphelin
Pour répondre à cette question l'approche actuelle n'est pas idéal. En effet, j'ai représenté mes noeuds sous forme d'élément contenant un identifiant unique et les liaisons entre ces noeuds sont représentées de la manière suivante :
Avec cette structure, pour savoir si 2 noeuds sont connectés ensemble on est obligé de parcourir tout le graph ce qui est peu efficace, surtout si le nombre de noeuds / liens commence à grandir. Et c'est là que le Union Find intervient.
Sommaire
00:00 Introduction
10:23 Optimisation : Compression de chemin
12:04 Optimisation : Groupement par taille
17:00 Cas concret
20:10 Conclusion
Méthodes de bases
Comme son nom l'indique l'objectif du Union Find est de fournir 2 méthodes qui permettront récupérer des informations sur le graph.
Au niveau de l'implémentation, on va sauvegarder dans un dictionnaire (clef / valeur) les éléments et leur parent. Si un élément est son propre parent alors on considèrera qu'il à la racine du groupe auquel il appartient.
Dans la méthode find, on cherchera à remonter à la racine
Dans la méthode union, on attachera l'élément à la racine du groupe systématiquement.
Avec cette structure si on souhaite savoir si 2 noeuds sont dans le même groupe, il suffit de vérifier si ils sont dans le même groupe.
Optimisations
Maintenant que l'on a le concept de base il y a 2 optimisations qui vont permettre de rendre ce type de structure performant quelque soit la taille du graph.
Compression des chemins
La première optimisation consiste à compresser les chemins lors de la méthode find() afin de limiter le nombre de noeuds à parcourir pour retrouver le groupe auquel appartient un noeud.
Union par taille / rang
La seconde optimisation consister à mieux choisir comment on unifie 2 groupes ensemble. Plutôt que de choisir arbitrairement, on va choisir de faire en sorte que le groupe le plus petit devienne enfant du groupe le plus grand.
Cette optimisation permet en plus de connaître facilement la taille d'un groupe.