Quand devrais-je utiliser Kruskal par opposition à Prim (et vice versa)?

Réponses:

201

Utilisez l'algorithme de Prim lorsque vous avez un graphique avec beaucoup d'arêtes.

Pour un graphe avec V sommets E bords, l'algorithme de Kruskal s'exécute en temps O (E log V) et l'algorithme de Prim peut s'exécuter en temps amorti O (E + V log V) , si vous utilisez un tas de Fibonacci .

L'algorithme de Prim est nettement plus rapide dans la limite lorsque vous avez un graphe vraiment dense avec beaucoup plus d'arêtes que de sommets. Kruskal fonctionne mieux dans les situations typiques (graphiques épars) car il utilise des structures de données plus simples.

Todd Gamblin
la source
8
Je dirais "situations typiques" au lieu de moyenne .. Je pense que c'est un terme obscur à utiliser, par exemple quelle est la "taille moyenne" d'une table de hachage? aucune idée.
yairchu le
2
@SplittingField: Je pense que vous comparez des pommes et des oranges. L'analyse amortie est simplement un moyen d'obtenir une mesure de la fonction (pour ainsi dire) --- que ce soit le pire des cas ou le cas moyen dépend de ce que vous prouvez. En fait (comme je le regarde maintenant), l'article du wiki utilise un langage qui implique qu'il n'est utilisé que pour l'analyse du pire des cas. Maintenant, utiliser une telle analyse signifie que vous ne pouvez pas faire de promesses aussi fortes sur le coût d'une opération particulière, mais au moment où l'algorithme sera terminé, il le fera effectivement par O (E + VlogV), même dans le pire des cas.
agorenst
10
Cela semble bien en théorie, mais je parie que peu de gens peuvent mettre en œuvre un tas de Fibonacci
Alexandru
2
@tgamblin, il peut y avoir des arêtes C (V, 2) dans le pire des cas. Donc, la compatibilité temporelle de l'algorithme de Prim ne se résume-t-elle pas à O (V ^ 2 + VlogV) c'est-à-dire O (V ^ 2) en cas de tas de fibonacci?
Gobelin vert
7
Il y a aussi un autre facteur important: la sortie de Prims n'est un MST que si le graphe est connecté (la sortie me semble inutile autrement), mais la sortie de Kruskal est les forêts Minimum Spanning (avec une certaine utilité).
Andrei I
102

J'ai trouvé un très joli fil sur le net qui explique la différence de manière très simple: http://www.thestudentroom.co.uk/showthread.php?t=232168 .

L'algorithme de Kruskal développera une solution à partir du bord le moins cher en ajoutant le prochain bord le moins cher, à condition qu'il ne crée pas de cycle.

L'algorithme de Prim fera croître une solution à partir d'un sommet aléatoire en ajoutant le prochain sommet le moins cher, le sommet qui n'est pas actuellement dans la solution mais qui lui est connecté par l'arête la moins chère.

Ci-joint une feuille intéressante sur ce sujet.entrez la description de l'image icientrez la description de l'image ici

Si vous implémentez à la fois Kruskal et Prim, sous leur forme optimale: avec une recherche d'union et un tas de finbonacci respectivement, vous remarquerez à quel point Kruskal est facile à implémenter par rapport à Prim.

Prim est plus difficile avec un tas de fibonacci principalement parce que vous devez maintenir une table de comptabilité pour enregistrer le lien bidirectionnel entre les nœuds du graphe et les nœuds du tas. Avec une Union Find, c'est le contraire, la structure est simple et peut même produire directement le mst sans frais supplémentaires.

Snicolas
la source
2
Nitpick: La dernière 'diapositive' de chaque devrait se lire "répéter jusqu'à ce que vous ayez un arbre couvrant"; pas avant MST, qui est en quelque sorte une tâche récursive - comment savoir que c'est minime - c'est pourquoi je suis Prim's / Kruskal's pour commencer!
OJFord
@OllieFord J'ai trouvé ce fil pour avoir cherché une illustration simple des algorithmes de Prim et Kruskal. Les algorithmes garantissent que vous trouverez un arbre et que cet arbre est un MST. Et vous savez que vous avez trouvé un arbre lorsque vous avez exactement des V-1 bords.
mikedu95
@ mikedu95 Vous avez raison, en faisant le même argument que mon commentaire précédent sous un angle différent.
OJFord
Mais n'est-ce pas une condition préalable que vous ne devez choisir qu'avec un seul poids entre les sommets, vous ne pouvez pas choisir le poids 2 plus d'une fois dans le graphique ci-dessus, vous devez choisir le poids suivant ex: 3 @Snicolas
ani0904071
30

Je sais que vous ne l'avez pas demandé, mais si vous avez plus d'unités de traitement, vous devriez toujours considérer l'algorithme de Borůvka , car il pourrait être facilement parallélisé - il a donc un avantage de performance par rapport à l'algorithme de Kruskal et Jarník-Prim.

malejpavouk
la source
23

Kruskal peut avoir de meilleures performances si les arêtes peuvent être triées en temps linéaire ou sont déjà triées.

Prim est meilleur si le nombre d'arêtes aux sommets est élevé.

Daniel C. Sobral
la source
19

Le pire des cas de complexité temporelle de Kruskal est O (E log E) , car nous devons trier les arêtes. Le pire des cas de complexité temporelle Prim est O (E log V) avec file d'attente prioritaire ou mieux encore, O (E + V log V) avec Fibonacci Heap . Nous devrions utiliser Kruskal lorsque le graphe est clairsemé, avec un petit nombre d'arêtes, comme E = O (V), lorsque les arêtes sont déjà triées ou si nous pouvons les trier en temps linéaire. Nous devrions utiliser Prim lorsque le graphe est dense, c'est-à-dire que le nombre d'arêtes est élevé, comme E = O (V²).

Ghiurutan Alexandru
la source
Il me semble que Prim n'est jamais pire que Kruskal en termes de vitesse. Puisque E doit être au moins V-1, il y a un arbre couvrant. Je pense que la raison pour laquelle nous préférons Kruskal pour un graphe clairsemé est que sa structure de données est très simple.
Yu Gu
16

Si nous arrêtons l'algorithme au milieu, l'algorithme de prim génère toujours un arbre connecté, mais kruskal d'un autre côté peut donner un arbre ou une forêt déconnecté

Prakhar
la source
5

Une application importante de l'algorithme de Kruskal est le clustering à liaison unique .

Considérez n sommets et vous avez un graphe complet.Pour obtenir un k clusters de ces n points, exécutez l'algorithme de Kruskal sur les n- (k-1) premiers arêtes de l'ensemble trié d'arêtes.Vous obtenez k-cluster du graphe avec un maximum espacement.

Jaskaran
la source
3

Le meilleur moment pour Kruskal est O (E logV). Pour Prim utilisant des tas de fibres, nous pouvons obtenir O (E + V lgV). Par conséquent, sur un graphe dense, celui de Prim est bien meilleur.

Léon Stenneth
la source
2

Prim's est meilleur pour les graphes plus denses, et en cela nous n'avons pas non plus à prêter beaucoup d'attention aux cycles en ajoutant une arête, car nous avons principalement affaire à des nœuds. Prim est plus rapide que Kruskal dans le cas des graphes complexes.

Sakshi
la source
2

Dans l'algorithme de kruskal, nous avons le nombre d'arêtes et le nombre de sommets sur un graphe donné, mais sur chaque arête, nous avons une valeur ou un poids pour lequel nous pouvons préparer un nouveau graphe qui ne doit pas être cyclique ou ne se fermer d'aucun côté Par exemple

graphique comme celui-ci _____________ | | | | | | | __________ | | Donnez un nom à n'importe quel sommet a, b, c, d, e, f.

Abhishek
la source