Apprentissage interactif de la théorie des graphes
Apprentissage interactif de la théorie des graphes
Guest User
Using app without sign in
Calculateur d'arbre couvrant minimal
Construit l'ACM en triant les arêtes et évitant les cycles
Sélectionnez un algorithme et générez les étapes pour commencer la visualisation
L'algorithme de Kruskal trouve un arbre couvrant de poids minimal en considérant les arêtes par poids croissant et en ajoutant chaque arête qui ne crée pas de cycle. Contrairement à l'approche de croissance d'arbre de Prim, Kruskal fait croître une forêt de composantes qui fusionnent progressivement en un seul arbre.
Après avoir trié toutes les arêtes par poids, l'algorithme les parcourt de la plus petite à la plus grande. Pour chaque arête, il utilise une structure Union-Find (ensembles disjoints) pour vérifier en temps quasi constant si les deux extrémités sont déjà dans la même composante. Si ce n'est pas le cas, l'arête est acceptée et les composantes fusionnent ; sinon elle est écartée comme arête de cycle. Le tri domine le coût, donnant O(E log E) temps.
L'algorithme de Kruskal est préféré pour les graphes creux et les problèmes où les arêtes arrivent déjà triées, comme le clustering à lien simple, la segmentation d'images et la conception de réseaux par paliers de coût. La structure Union-Find intégrée est elle-même un sujet d'entretien majeur, couvrant la compression de chemin et l'union par rang.
Trie toutes les arêtes par poids, puis parcours la liste en ajoutant toute arête reliant deux composantes distinctes. Union-Find rend le test « composantes distinctes » pratiquement gratuit, ce qui est la clé de l'efficacité de l'ensemble.
Kruskal(graphe):
trier toutes les aretes par poids croissant
creerEnsemble(v) pour chaque sommet v
acm = []
pour chaque arete (u, v, w) dans l ordre trie:
si trouver(u) != trouver(v): // composantes distinctes
unir(u, v)
acm.ajouter((u, v, w))
si acm a V - 1 aretes: sortir
renvoyer acmKruskal fait croître une forêt, pas un arbre. Plusieurs fragments non connectés se développent indépendamment et fusionnent à mesure que des arêtes bon marché les relient, ce qui constitue la différence structurelle avec Prim et explique que Kruskal traite gratuitement les graphes non connexes: il renvoie simplement une forêt couvrante de poids minimum. La correction découle de la propriété de coupe appliquée aux frontières entre composantes, exactement comme pour Prim.
Construis l'arbre couvrant de poids minimum sur le graphe déjà utilisé pour Prim, afin de comparer les deux ordres de découverte sur des données identiques.
Graphe d'exemple: Arêtes non orientées A-B (2), A-C (3), B-C (1), C-D (4) et B-D (7).
L'arbre couvrant de poids minimum est B-C, A-B et C-D pour un poids total de 1 + 2 + 4 = 7, identique à celui produit par Prim depuis A. Les arbres coïncident, comme ils le doivent lorsque les poids sont distincts, mais l'ordre de découverte diffère: Prim a suivi A-B, B-C, C-D en croissant vers l'extérieur depuis A, tandis que Kruskal a suivi B-C, A-B, C-D en pur ordre de poids et a dû rejeter explicitement une arête fermant un cycle en chemin. Cette différence d'ordre est visible dans le visualiseur et constitue la meilleure façon de saisir ce qui distingue réellement les deux algorithmes.
Temps: O(E log E) · Espace: O(V + E)
Le tri des arêtes domine tout le reste avec O(E log E), ce qui équivaut à O(E log V) puisque E vaut au plus V au carré et que log E reste donc à un facteur constant de log V. Après le tri, la boucle effectue au plus 2E opérations de recherche et V - 1 unions. Avec compression de chemin et union par rang, chacune coûte la fonction d'Ackermann inverse de V, inférieure à 5 pour toute entrée tenant en mémoire et traitée comme constante. La partie Union-Find est donc effectivement en O(E) et le tri représente la totalité du coût. Lorsque les arêtes arrivent déjà triées, ou peuvent être réparties en seaux parce que les poids sont de petits entiers, Kruskal descend à quasi linéaire et bat nettement Prim.
Kruskal et Prim résolvent le même problème. La densité, l'ordre des arêtes et la connexité décident lequel est préférable.
| Alternative | À préférer quand | Coût |
|---|---|---|
| Algorithme de Prim | Graphes denses, où E approche V au carré et où trier toutes les arêtes serait du gaspillage. | O(E log V) ou O(V^2) |
| Algorithme de Boruvka | Tu veux paralléliser. Chaque composante choisit simultanément son arête sortante la moins chère. | O(E log V) |
| Kruskal avec tri par seaux | Les poids sont de petits entiers, le tri devient linéaire et Kruskal quasi linéaire dans son ensemble. | O(E·α(V)) |
| Forêt couvrante de poids minimum | Le graphe est non connexe. Kruskal le fait déjà sans aucune modification. | O(E log E) |
Lire l'article complet: Minimum Spanning Trees: Prim, Kruskal and Boruvka
Algorithmes associés: Algorithme de Prim, Algorithme de Borůvka, Détection de Cycles