Menu
Coddy logo textTech

Algorithme de Kruskal

Dernière mise à jour

L'algorithme de Kruskal construit un arbre couvrant minimal (MST) - l'ensemble d'arêtes le moins coûteux qui relie tous les nœuds sans cycle. Il trie toutes les arêtes par poids, puis ajoute gloutonnement l'arête la moins chère suivante tant qu'elle relie deux nœuds pas encore connectés. Appuyez sur lecture ci-dessus pour voir l'arbre grandir, une arête sûre et bon marché à la fois.

La vérification « déjà connectés ? » se fait avec une structure de données union-find (ensembles disjoints) : chaque arête est ignorée si ses deux extrémités sont déjà dans le même composant, car l'ajouter formerait un cycle. Le tri domine le coût, donnant O(E log E) au total. Kruskal brille sur les graphes creux.

Complexité en temps et en espace

MesureComplexitéNotes
TempsO(E log E)Dominé par le tri des arêtes
Opérations union-find≈ O(E α(V))Presque constant par vérification avec compression de chemin
EspaceO(V + E)Liste d'arêtes + structure d'ensembles disjoints
Idéal pourGraphes creuxFonctionne à partir d'une liste globale d'arêtes

Étape par étape

ÉtapeCe qui se passe
1Trier chaque arête par poids, en ordre croissant.
2Placer chaque nœud dans son propre composant (union-find).
3Prendre l'arête la moins chère suivante.
4Si ses extrémités sont dans des composants différents, l'ajouter à l'arbre et les unir.
5Sinon, l'ignorer (elle créerait un cycle).
6S'arrêter quand l'arbre a V − 1 arêtes.

Exemple résolu

Graphe avec les nœuds A, B, C, D et les arêtes A-B(1), B-C(2), A-C(3), C-D(4), B-D(5). Arêtes triées : A-B(1), B-C(2), A-C(3), C-D(4), B-D(5) :

Arête (poids)Composants avantAction
A-B(1){A} {B} {C} {D}Composants différents - ajouter au MST, unir en {A,B}.
B-C(2){A,B} {C} {D}Composants différents - ajouter au MST, unir en {A,B,C}.
A-C(3){A,B,C} {D}A et C sont déjà ensemble - ignorer (formerait un cycle).
C-D(4){A,B,C} {D}Composants différents - ajouter au MST, unir en {A,B,C,D}.
Arrêt{A,B,C,D}L'arbre a V - 1 = 3 arêtes. MST = A-B, B-C, C-D, poids total 7.

Quand utiliser l'algorithme de Kruskal

À utiliser quandÀ éviter quand
Le graphe est creux (peu d'arêtes par rapport aux nœuds).Le graphe est dense - Prim avec un tas est généralement plus rapide.
Les arêtes sont déjà disponibles sous forme de liste globale triable.Les arêtes n'arrivent que via des listes d'adjacence à parcourir par nœud.
Vous voulez une implémentation simple appuyée sur l'union-find.Vous avez besoin que l'arbre grandisse depuis un nœud de départ précis.
Vous voulez construire une forêt couvrante d'un graphe non connexe.Vous devez gérer des arêtes en flux sans tri complet.

Code de Kruskal's Algorithm

Une implémentation propre et exécutable de Kruskal's Algorithm en Python, JavaScript, Java, C++, C. Choisissez un langage, copiez le code ou ouvrez-le préchargé dans le Playground Coddy.

Code de Kruskal's Algorithm en Python

Python
1def find(parent, x):2    while parent[x] != x:3        parent[x] = parent[parent[x]]  # path compression4        x = parent[x]5    return x6
7
8def kruskal(vertices, edges):9    # Take the cheapest edge that does not close a cycle10    parent = {v: v for v in vertices}11    mst, total = [], 012    for w, u, v in sorted(edges):13        root_u, root_v = find(parent, u), find(parent, v)14        if root_u != root_v:15            parent[root_u] = root_v16            mst.append((u, v, w))17            total += w18    return mst, total19
20
21vertices = ["A", "B", "C", "D", "E"]22edges = [23    (4, "A", "B"), (1, "A", "C"), (3, "B", "C"), (2, "B", "D"),24    (5, "C", "D"), (6, "C", "E"), (7, "D", "E"),25]26
27mst, total = kruskal(vertices, edges)28for u, v, w in mst:29    print(f"{u} - {v} (weight {w})")30print("Total MST weight:", total)
Exécutez ce code dans le Playground Python

FAQ sur l'algorithme de Kruskal

Qu'est-ce qu'un arbre couvrant minimal ?
Un arbre couvrant minimal (MST) d'un graphe pondéré connexe est un sous-ensemble d'arêtes qui relie tous les nœuds sans cycle et avec le poids total le plus petit possible. Il a exactement V - 1 arêtes pour V nœuds.
Quelle est la différence entre l'algorithme de Kruskal et celui de Prim ?
Les deux construisent un arbre couvrant minimal de manière gloutonne. Kruskal trie toutes les arêtes globalement et ajoute la moins chère qui ne forme pas de cycle, en utilisant l'union-find. Prim fait grandir un seul arbre vers l'extérieur depuis un nœud de départ, ajoutant toujours l'arête la moins chère qui quitte l'arbre. Kruskal convient aux graphes creux ; Prim (avec un tas) aux graphes denses.
Pourquoi l'algorithme de Kruskal utilise-t-il l'union-find ?
Avant d'ajouter une arête, Kruskal doit vérifier si ses deux extrémités sont déjà connectées - ajouter une telle arête créerait un cycle. L'union-find (ensembles disjoints) répond à « sont-ils dans le même composant ? » et fusionne les composants en temps amorti quasi constant, ce qui garde l'algorithme efficace.
Quand devrais-je utiliser l'algorithme de Kruskal plutôt que celui de Prim ?
Préférez Kruskal quand le graphe est creux et que vous avez déjà toutes les arêtes sous forme de liste triable - le tri O(E log E) est bon marché quand E est petit. L'algorithme de Prim avec un tas binaire ou de Fibonacci tend à gagner sur les graphes denses où E s'approche de , car il évite de trier toutes les arêtes au préalable.
L'algorithme de Kruskal fonctionne-t-il sur les graphes non connexes ?
Oui. Si le graphe est non connexe, Kruskal ne peut simplement pas atteindre V - 1 arêtes et produit à la place une forêt couvrante minimale - un MST par composant connexe. Cela découle naturellement du fait que l'union-find ne fusionne jamais des nœuds sans chemin entre eux.
Quelle est l'erreur la plus courante lors de l'implémentation de l'algorithme de Kruskal ?
Omettre la compression de chemin et l'union par rang de l'union-find, ce qui fait passer chaque vérification de connectivité de quasi constant à quasi linéaire et peut dominer le temps d'exécution. Une autre erreur fréquente est d'oublier d'unir réellement les deux composants après l'ajout d'une arête, ce qui laisse des arêtes ultérieures créer des cycles.
Coddy programming languages illustration

Maîtrisez les algorithmes avec Coddy

COMMENCER