Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
T
tp-union-find-etu
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
lifapc
tp-union-find-etu
Commits
1cc06209
Commit
1cc06209
authored
6 years ago
by
Vincent Nivoliers
Browse files
Options
Downloads
Patches
Plain Diff
fin de l'optimisation dans le sujet
parent
a672cd99
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
Images/uf_compression.png
+0
-0
0 additions, 0 deletions
Images/uf_compression.png
Images/uf_compression.tex
+56
-0
56 additions, 0 deletions
Images/uf_compression.tex
readme.md
+38
-2
38 additions, 2 deletions
readme.md
with
94 additions
and
2 deletions
Images/uf_compression.png
0 → 100644
+
0
−
0
View file @
1cc06209
8.95 KiB
This diff is collapsed.
Click to expand it.
Images/uf_compression.tex
0 → 100644
+
56
−
0
View file @
1cc06209
\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
}
(-1,0) node[ufnode] (n30)
{
3
}
(1,0) node[ufnode] (n40)
{
4
}
(1,-1) node[ufnode] (n50)
{
5
}
;
\draw
[ufedge]
(n00) -- (n10) ;
\draw
[ufedge]
(n20) -- (n10) ;
\draw
[ufedge]
(n30) -- (n00) ;
\draw
[ufedge]
(n40) -- (n00) ;
\draw
[ufedge]
(n50) -- (n40) ;
\draw
[ufedge]
(n10) edge[loop above] (n10) ;
\draw
[ufedge]
(4,1) -- (6.5,1) ;
\draw
(-0.5,1) +(9,0) node[ufnode] (n01)
{
0
}
(1,2) +(9,0) node[ufnode] (n11)
{
1
}
(2.5,1) +(9,0) node[ufnode] (n21)
{
2
}
(-1.5,0) +(9,0) node[ufnode] (n31)
{
3
}
(0.5,1) +(9,0) node[ufnode] (n41)
{
4
}
(1.5,1) +(9,0) node[ufnode] (n51)
{
5
}
;
\draw
[ufedge]
(n01) -- (n11) ;
\draw
[ufedge]
(n21) -- (n11) ;
\draw
[ufedge]
(n31) -- (n01) ;
\draw
[ufedge]
(n41) -- (n11) ;
\draw
[ufedge]
(n51) -- (n11) ;
\draw
[ufedge]
(n11) edge[loop above] (n11) ;
\end{tikzpicture}
\end{document}
This diff is collapsed.
Click to expand it.
readme.md
+
38
−
2
View file @
1cc06209
...
...
@@ -173,7 +173,43 @@ peuvent être nettement améliorées grâce à deux idées simples à mettre en
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.
la racine trouvée, tous les nœuds sur le chemin changent de parent pour prendre
directement la racine pour parente. Cette optimisation est particulièrement
facile dans le cadre d'une implémentation récursive de la recherche de racine.
Dans l'image ci-dessous, une recherche de racine sur le noeud 5 va modifier les
parents de 5 et 4 pour qu'ils se placent directement sous 1.

#### Minimisation des hauteurs
La complexité d'une recherche dans le pire cas est la hauteur de l'arbre dans
laquelle elle est lancée. Lors de l'union de deux ensembles, il est possible
d'essayer de faire en sorte de n'augmenter les hauteurs des arbres que le moins
possible. Si les deux arbres dont de profondeurs différentes, en spécifiant la
racine de l'arbre le plus profond comme parente de la racine de l'arbre le moins
profond, la profondeur de l'arbre final est la même que celle de l'arbre le plus
profond. Ce n'est donc que lorsqu'on fusionne deux arbres de mêmes hauteurs
que nous obtenons un arbre de profondeur plus importante.
La compression de chemin modifie la profondeur des arbres. Il est ainsi
difficile d'avoir la valeur exacte de leur profondeur. On se contente donc d'une
approximation, en faisant comme s'il n'y avait jamais eu de compression de
chemin. Cette approximation est donc toujours pire que la réalité.
Pour stocker les hauteurs, il vous suffit d'ajouter un tableau qui stocke pour
chaque nœud une profondeur. Initialement toutes les profondeurs sont à 1. Lors
d'une fusion, seule les profondeurs des racines sont importantes. Les
profondeurs des nœuds ne restent donc utiles que tant qu'il sont la racine de
leur arbre. Dès qu'ils se retrouvent sous un parent, il n'est plus nécessaire de
mettre à jour leur profondeur.
#### Complexité finale
Avec ces deux optimisations, la compression de chemin devient beaucoup plus
efficace lorsque la complexité est examinée de façon amortie sur un grand nombre
d'opérations. Les deux opérations de recherche et d'union peuvent ainsi être
réalisées avec une complexité de l'ordre de l'inverse de la fonction
d'Ackermann. En pratique, pour des valeurs de n raisonnables, l'inverse de la
fonction d'Ackermann ne dépasse pas 5, donc cette complexité est très proche
d'une complexité constante.
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment