Transparents union-find
Transcription
Transparents union-find
Relation d'équivalence Relation d'équivalence Créer une partition triviale Vérifier si x ~ y Fusionner deux classes Relation d'équivalence Créer une partition triviale Vérifier si x ~ y Fusionner deux classes Relation d'équivalence Créer une partition triviale Vérifier si x ~ y Fusionner deux classes Union-find Créer une partition triviale Vérifier si x ~ y Fusionner deux classes Relation d'équivalence Créer une partition triviale Vérifier si x ~ y Fusionner deux classes Motivation : générer un labyrinthe On ne veut pas de boucle Démarche générale Démarche générale Démarche générale Notre but ● On peut aller partout ● Pas de boucle c ~ d : il y a un chemin de c à d ● Une classe d'équivalence ● On ne casse pas de mur entre c et d si c ~ d ● Casser un mur entre c et d : c et d sont dans la même classe Implémentation naïve Première implémentation avec des arbres Union-find Créer union-find Find Union Union-find Créer union-find Find Union Union-find Créer union-find Find Union Union-find Créer union-find Find Union Union-find Créer union-find Find Union Une partition = une forêt Une partition = une forêt Find(x) x Union(x, y) r r' x y Union(x, y) r' r x y Union(x, y) r r x y Union(x, y) r+1 r x y Amélioration de l'implémentation : compression de chemin Find(x) avant b a x Find(x) avec compression de chemin b a x Find(x) avec compression de chemin x a b Lors d'une union(x, y)... r' r x y le rang de ne changera plus. r' r x y L'intervalle des rangs possibles découpé en sous-intervalles fous ! 2 2 2 2 2 le rang de ne changera plus. r' r € x y Dette maximale... 7n € au max en pratique... Find... combien d'opérations ? b a x Mais certaines opérations sont comptabilisés comme des paiements ! b a x 1€ Va-t-il débourser tout son argent ? 1€ e y a p a ! e r o c n e a r et paie x a b Personne n'a de dettes ! 1€ e y a p a ! s u l p e i a p e mais n x a b