D’une part, par l’invariant en (∗), il existe un chemin cxdans E\ {{x,y}} de x0àxet un
chemin de cydans E\{{x,y}} de yày0. On construit alors un chemin de Een concaténant
cx,x↔yet cy.On a x0et y0sont reliés pas des arêtes dans E.
D’autre part, les classes de xet ysont fusionnées par CC.union(x,y). Donc x0et y0sont
dans la même composante dans CC.
Cas où x0est dans la classe xet y0dans une autre classe que xou yen (∗)
D’une part, montrons qu’il n’y a pas de chemin dans Ede x0ày0. Par l’absurde, sup-
posons qu’il existe un tel chemin. Si ce chemin est intégralement dans E\ {{x,y}}, alors
par l’invariant, x0et y0devraient être dans la même classe en (∗) ce qui n’est pas le cas.
Donc le chemin dans Ede x0ày0passe par l’arête {x,y}. Mais alors soit y0est dans la
classe de xou y... Non.
D’autre part, les classes de x0et y0ne sont pas fusionnées par CC.
À présent, montrons que Eest un ACM.
— D’une part, (S,E) est un arbre.
— D’une part (S,E) est connexe. Cela resulte de la connexité de Get du traitement
systématique de toute les arêtes de G. En effet, si x,y∈S, on sait que xet ysont
reliés dans G:x=x1↔x2↔ ··· ↔ xn↔y.
On construit alors un chemin de xàyavec des arêtes de Ede la manière suivante.
Pour tout i, si {xi,xi+1} ∈ E, on prend cette arête dans le chemin. Sinon, si {xi,xi+1}<
E, lorsque l’algorithme a traité {xi,xi+1},{xi,xi+1}n’a pas été ajouté à E. On avait xiet
xi+1dans la même composante CC. Donc, l’invariant nous dit qu’il y avait un chemin
de xiàxi+1dans E(il est toujours intégralement composé d’arêtes de Epuisque E
est croissant lors de l’algorithme). Donc on prend ce chemin pour aller de xiàxi+1.
On a ainsi construit un chemin de xàyavec des arêtes de E.
— D’autre part, il est acyclique. S’il contenait un cycle, regardons la dernière arête
{x,y}ajouté de ce cycle. Par l’invariant, il existait un chemin de xàydonc l’arête
n’aurait pas dû être ajoutée. Contradiction.
— D’autre part, il est minimal. En effet, par l’invariant, il existe T0ACM tel que E⊆T0.
(S,E) est un arbre donc il contient |S| − 1 arêtes. De même pour T0. Donc E=T0.
Complexité
Théorème. L’algorithme de Kruskal s’exécute en
|creer_union_ f ind|+O(Aln(A)) +O(A(|f ind|+|union|)).
D´
emonstration.
Il y a la création de la structure union find, puis le tri, puis une boucle, dont chaque passage
de boucle appelle f ind et union.Autrement dit pour des arbres de type union-find :
—|creer_union_f ind|:O(S) ;
—f ind et union en O(ln S).
Bilan : Comme |S| − 1≤ |A|, on a dans le pire des cas une complexité en O(Aln(A)). Cela
peut se réécrire en O(Aln(S)) car |A|≤|S|2et donc ln A=2 ln S. Si le tri de Aa déjà été fait
alors la complexité peut être en O(Aln∗(S)) avec la structure union find avec compression de
chemin.
François Schwarzentruber Page 101 ALGO1 - ENS Rennes