From c185b516c785aa660734ccf31fe3bfd836268427 Mon Sep 17 00:00:00 2001
From: Vincent Nivoliers <vincent.nivoliers@univ-lyon1.fr>
Date: Tue, 5 Mar 2019 18:20:54 +0100
Subject: [PATCH] premier jet du sujet

---
 Images/uf_example.png | Bin 0 -> 7792 bytes
 Images/uf_example.tex |  47 +++++++++++
 Images/uf_fusion.png  | Bin 0 -> 9078 bytes
 Images/uf_fusion.tex  |  56 +++++++++++++
 readme.md             | 178 ++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 281 insertions(+)
 create mode 100644 Images/uf_example.png
 create mode 100644 Images/uf_example.tex
 create mode 100644 Images/uf_fusion.png
 create mode 100644 Images/uf_fusion.tex

diff --git a/Images/uf_example.png b/Images/uf_example.png
new file mode 100644
index 0000000000000000000000000000000000000000..fe96b2244a1a228e2b135bbcf6e26b0a00a56dff
GIT binary patch
literal 7792
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
R@qdQ_IvNJ*)vER}{{yc6;dcN4

literal 0
HcmV?d00001

diff --git a/Images/uf_example.tex b/Images/uf_example.tex
new file mode 100644
index 0000000..15b2641
--- /dev/null
+++ b/Images/uf_example.tex
@@ -0,0 +1,47 @@
+\documentclass{standalone}
+\usepackage{tikz}
+
+\begin{document}
+
+\tikzset{
+  ufnode/.style={
+    circle,
+    draw,
+    thick
+  },
+  ufedge/.style={
+    -latex, 
+    thick
+  }
+}
+
+\begin{tikzpicture}
+  \draw
+  (0,1) node[ufnode] (n0) {0}
+  (1,2) node[ufnode] (n1) {1}
+  (2,1) node[ufnode] (n2) {2}
+  (5,1) node[ufnode] (n3) {3}
+  (6,2) node[ufnode] (n4) {4}
+  (7,1) node[ufnode] (n5) {5}
+  (7,0) node[ufnode] (n6) {6}
+  (10,1) node[ufnode] (n7) {7}
+  (10,2) node[ufnode] (n8) {8}
+  (13,2) node[ufnode] (n9) {9}
+  ;
+
+  \draw[ufedge] (n0) -- (n1) ;
+  \draw[ufedge] (n2) -- (n1) ;
+  \draw[ufedge] (n1) edge[loop above] (n1) ;
+
+  \draw[ufedge] (n3) -- (n4) ;
+  \draw[ufedge] (n5) -- (n4) ;
+  \draw[ufedge] (n6) -- (n5) ;
+  \draw[ufedge] (n4) edge[loop above] (n4) ;
+
+  \draw[ufedge] (n7) -- (n8) ;
+  \draw[ufedge] (n8) edge[loop above] (n8) ;
+
+  \draw[ufedge] (n9) edge[loop above] (n9) ;
+\end{tikzpicture}
+
+\end{document}
diff --git a/Images/uf_fusion.png b/Images/uf_fusion.png
new file mode 100644
index 0000000000000000000000000000000000000000..b2f723aed62e93af2e94046aa6eaa74cf4f430fc
GIT binary patch
literal 9078
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
S*ABHt24J9TqEoGfeDXhclU1Vt

literal 0
HcmV?d00001

diff --git a/Images/uf_fusion.tex b/Images/uf_fusion.tex
new file mode 100644
index 0000000..55aeb55
--- /dev/null
+++ b/Images/uf_fusion.tex
@@ -0,0 +1,56 @@
+\documentclass{standalone}
+\usepackage{tikz}
+
+\begin{document}
+
+\tikzset{
+  ufnode/.style={
+    circle,
+    draw,
+    thick
+  },
+  ufedge/.style={
+    -latex, 
+    thick
+  }
+}
+
+\begin{tikzpicture}
+  \draw
+  (0,1) node[ufnode] (n00) {0}
+  (1,2) node[ufnode] (n10) {1}
+  (2,1) node[ufnode] (n20) {2}
+  (4,1) node[ufnode] (n30) {3}
+  (5,2) node[ufnode] (n40) {4}
+  (6,1) node[ufnode] (n50) {5}
+  (6,0) node[ufnode] (n60) {6}
+
+  (0,1) +(10,0) node[ufnode] (n01) {0}
+  (1,2) +(10,0) node[ufnode] (n11) {1}
+  (2,1) +(10,0) node[ufnode] (n21) {2}
+  (4,1) +(10,0) node[ufnode] (n31) {3}
+  (5,2) +(10,0) node[ufnode] (n41) {4}
+  (6,1) +(10,0) node[ufnode] (n51) {5}
+  (6,0) +(10,0) node[ufnode] (n61) {6}
+  ;
+
+  \draw[ufedge] (n00) -- (n10) ;
+  \draw[ufedge] (n20) -- (n10) ;
+  \draw[ufedge] (n10) -- (n40) ;
+
+  \draw[ufedge] (n30) -- (n40) ;
+  \draw[ufedge] (n50) -- (n40) ;
+  \draw[ufedge] (n60) -- (n50) ;
+  \draw[ufedge] (n40) edge[loop above] (n4) ;
+
+  \draw[ufedge] (n01) -- (n11) ;
+  \draw[ufedge] (n21) -- (n11) ;
+  \draw[ufedge] (n11) edge[loop above] (n11) ;
+
+  \draw[ufedge] (n31) -- (n41) ;
+  \draw[ufedge] (n51) -- (n41) ;
+  \draw[ufedge] (n61) -- (n51) ;
+  \draw[ufedge] (n41) -- (n11) ;
+\end{tikzpicture}
+
+\end{document}
diff --git a/readme.md b/readme.md
index 8a72264..374a1c1 100644
--- a/readme.md
+++ b/readme.md
@@ -1 +1,179 @@
 # Structure Union Find et labyrinthes
+
+Le but de ce TP est d'aborder le problème de l'Union-Find, et la structure de
+données associée, et de l'appliquer pour la création de labyrinthes.
+
+## Union Find
+
+Le problème de l'union find est de gérer des ensembles disjoints d'objets : un
+objet ne peut pas appartenir à deux ensembles en même temps. Initialement, tous
+les objets sont dans leur propre ensemble, qui ne contient qu'eux. Il est
+ensuite proposé deux opérations :
+
+* l'*union* permet de joindre deux ensembles ;
+* la *recherche* permet de déterminer si deux objets sont dans le même ensemble.
+
+## Application à la création de labyrinthe
+
+### Un labyrinthe intéressant
+
+Ce TP vous propose d'appliquer la notion d'union find à la création de
+labyrinthes. Cette création de labyrinthes se base sur le principe suivant :
+
+* le labyrinthe est créé sur une grille carrée ;
+* au début chaque case de la grille est entourée de murs ;
+* petit à petit des murs sont abattus pour créer le labyrinthe.
+
+En appliquant naïvement ce principe, il est peu probable que le labyrinthe
+obtenu soit intéressant. Tout d'abord, si le nombre de murs n'est pas important,
+il est peu probable que l'entrée et la sortie du labyrinthe soient accessibles
+par un chemin. Ensuite ce procédé va vider le labyrinthes de ses murs sans créer
+les recoins tortueux qui rendent les labyrinthes intéressants.
+
+![labyrinthe naïf](Images/naive_maze.png)
+
+Pour obtenir un résultat plus intéressant, nous allons donc rajouter les deux
+contraintes suivantes :
+
+* depuis toute case, il est possible d'aller à toute autre case ;
+* il n'y a qu'un seul chemin possible pour aller d'une case à une autre.
+
+Les labyrinthes ainsi obtenus deviennent plus intéressants.
+
+![labyrinthe intéressant](Images/clever_maze.png)
+
+C'est pour mettre en place ces contraintes que l'Union-Find devient utile.
+
+### Lien entre Union-Find et labyrinthes
+
+Le principe est de dire que deux cases sont dans le même ensemble s'il existe un
+chemin pour aller de l'une à l'autre dans le labyrinthe. Initialement, toutes
+les cases sont entourées de murs, et donc chaque case est dans son propre
+ensemble qui ne contient qu'elle.
+
+Abattre le mur entre les cases $a$ et $b$ permet de créer un chemin entre ces
+deux cases. Ainsi, pour s'assurer de ne jamais créer plus d'un chemin pour
+aller d'une case à une autre, il suffit de ne jamais abattre de mur séparant des
+cases qui sont déjà reliées par un chemin. On utilisera donc la *recherche* pour
+déterminer si deux cases sont reliées par un chemin ou non.
+
+En créant un chemin entre la case $a$ et la case $b$, on crée en réalité des
+chemins entre toutes les cases qu'on pouvait atteindre depuis $a$ et toutes les
+cases qu'on pouvait atteindre depuis $b$. On réalise donc l'*union* de
+l'ensemble contenant $a$ et de l'ensemble contenant $b$.
+
+## Implémentation
+
+Ce dépôt contient un code de base pour gérer les grilles les afficher, abattre
+et monter des murs. Il vous reste donc à rajouter des fichiers pour la structure
+d'Union-Find et tout ce que vous trouvez utile, et à compléter le constructeur
+de la classe `Labyrinthe` pour abattre des murs et créer un labyrinthe
+intéressant.
+
+### Union-Find
+
+#### Arbres
+
+Le principe de l'Union-Find est fondé sur des arbres, mais contrairement aux
+arbres binaires que vous avez déjà manipulés, ces arbres stockent les liens de
+parenté de bas en haut : chaque nœud connaît son *parent*. Par convention, le
+parent de la racine de l'arbre est lui-même. Chaque arbre correspond à un
+ensemble disjoint. Initialement, chaque élément est donc la racine de son propre
+arbre, qui ne contient que lui.
+
+![exemple union find](Images/uf_example.png)
+
+Dans l'exemple ci dessus, l'Union-Find contient 4 ensembles, $0$ est l'enfant de
+$1$, $1$ est la racine de son arbre.
+
+Du point de vue de l'implémentation, le plus simple est d'identifier les $n$
+objets par les entiers de $[0,n-1]$. Un tableau `tab` d'entiers de taille $n$
+permet de stocker dans la case $i$ le numéro du parent de la case $i$. Dans
+l'exemple précédent, nous aurions donc le tableau
+
+```
+[1, 1, 1, 4, 4, 4, 5, 8, 8, 9]
+```
+
+#### Recherche
+
+Chaque ensemble est identifié par la racine de l'arbre qui le représente. La
+recherche consiste donc à suivre la chaîne de parents d'un nœud jusqu'à
+atteindre la racine de l'arbre. Pour déterminer si deux nœuds sont dans le même
+ensemble, on regarde si les racines de leurs arbres sont identiques.
+
+#### Union
+
+Pour unir deux ensemble, il suffit de s'assurer que deux arbres initialement
+distincts finissent avec la même racine. Il suffit donc de faire en sorte que le
+parent de l'une des deux racines devienne l'autre racine.
+
+Dans l'exemple précédent la fusion des deux premier arbres donnerait donc l'un
+des deux arbres suivants
+
+![exemple de fusion](Images/uf_fusion.png)
+
+Ce qui revient à renseigner 4 comme parent de 1
+
+```
+[1, 4, 1, 4, 4, 4, ...]
+```
+
+ou à renseigner 1 comme parent de 4
+
+```
+[1, 1, 1, 4, 1, 4, ...]
+```
+
+### Mise en place pour les labyrinthes
+
+Muni·e de cette base pour l'Union-Find, il est désormais possible de l'utiliser
+pour nos labyrinthes.
+
+#### Mélange des murs
+
+Pour que les labyrinthes soient intéressants, il est nécessaire d'essayer
+d'abattre l'ensemble des murs dans un ordre aléatoire. La première solution
+naïve serait de tirer un mur au hasard, et s'il est debout d'essayer de
+l'abattre. Dans la mesure où petit à petit il ne sera plus possible d'abattre la
+majorité des murs, cette solution finira par coûter très cher pour abattre les
+derniers murs, et il sera difficile également de savoir quand s'arrêter.
+
+La bonne solution consiste à créer une petite structure de votre choix pour
+représenter un mur entre deux cases, et de stocker dans un tableau tous les murs
+possibles. Vous pouvez ensuite mélanger ce tableau en utilisant l'algorithme vu
+en cours, ou les fonctionnalités de la librairie standard.
+
+Une fois le tableau mélangé, vous pouvez le parcourir linéairement, et essayer
+d'abattre chacun des murs qu'il contient. Après un passage, il n'est plus
+possible d'abattre le moindre mur, et le labyrinthe respecte les contraintes.
+
+#### Utilisation de l'Union-Find
+
+Pour utiliser votre Union-Find, vous pouvez numéroter implicitement toutes les
+cases de la grille en disant que la case à la ligne $l$ et la colonne $c$ est
+associée au numéro $l \times \mathrm{largeur} + c$.
+
+À chaque mur traité, récupérez les racines des arbres Union-Find des cases de
+part et d'autre. Si les racines sont les mêmes, les cases sont déjà reliées par
+un chemin, et le mur doit rester en place, sinon vous pouvez l'abattre, et
+fusionner les ensembles des deux cases.
+
+### Optimisation de l'Union-Find
+
+L'implémentation initiale de l'Union-Find proposée peut être coûteuse en terme
+de complexité. Dans le pire des cas, les fusions sont réalisées dans un ordre
+tel que les arbres sont en réalité des sortes de listes chaînées, qu'il faut
+parcourir d'un bout à l'autre pour en trouver la racine. La complexité dans le
+pire des cas pour une recherche est donc linéaire, et la fusion nécessitant de
+trouver les racines des deux arbres a la même complexité. Ces complexités
+peuvent être nettement améliorées grâce à deux idées simples à mettre en œuvre.
+
+#### Compression de chemin
+
+Lorsque vous cherchez la racine d'un arbre, vous partez d'un nœud et sautez de
+nœud en nœud pour la trouver. La compression de chemin fait en sorte qu'une fois
+la racine trouvée, tous les nœuds sur le chemin changent de parent, pour prendre
+directement la racine pour parente.
+
+#### Minimisation des hauteurs
-- 
GitLab