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