web-dev-qa-db-fra.com

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

Je me demandais quand il fallait utiliser algorithme de Prim et quand celui de Kruskal pour trouver l'arbre de recouvrement minimal? Ils ont tous les deux une logique simple, les mêmes cas extrêmes, et la seule différence est leur mise en œuvre, qui peut impliquer des structures de données légèrement différentes. Alors, quel est le facteur décisif?

176
ebe

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

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

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

190
Todd Gamblin

J'ai trouvé un fil très agréable 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 fera évoluer une solution du Edge le moins cher en ajoutant le prochain Edge le moins cher, à condition de ne pas créer de cycle.

L'algorithme de Prim développera une solution à partir d'un sommet aléatoire en ajoutant le prochain sommet le moins cher, le sommet qui ne se trouve pas actuellement dans la solution, mais qui lui est connecté par le Edge le moins cher.

Vous trouverez ci-joint une feuille intéressante sur ce sujet.enter image description hereenter image description here

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

Prim est plus difficile avec un tas de fibonacci, principalement parce que vous devez tenir un tableau de comptabilité pour enregistrer le lien bidirectionnel entre les nœuds de graphe et les nœuds de tas. Avec une Union Find, c'est l'inverse, la structure est simple et peut même produire directement le mst sans presque aucun coût supplémentaire.

94
Snicolas

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

28
malejpavouk

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

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

22
Daniel C. Sobral

Si nous arrêtons l'algorithme dans middle, l'algorithme génère toujours un arbre connecté, mais kruskal peut en revanche donner un arbre ou une forêt déconnecté.

16
Prakhar

Kruskal La complexité temporelle dans le pire des cas est O (E log E), car nous devons trier les arêtes. Prim la complexité temporelle dans le pire des cas est O (E log V) avec file d'attente prioritaire ou même mieux, O (E + V log V) avec tas de Fibonacci. Nous devrions utiliser Kruskal lorsque le graphe est clairsemé, c'est-à-dire 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²).

12

Une application importante de l'algorithme de Kruskal est la suivante: regroupement de liaisons simples.

Considérez n sommets et vous avez un graphe complet.Pour obtenir des grappes ak de ces n points.exécutez l'algorithme de Kruskal sur les n premières arêtes (k-1) de l'ensemble des arêtes triées.Vous obtenez k-grappe du graphe avec un maximum espacement.

5
Jaskaran

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 graphique dense, Prim est bien meilleur.

3
Leon Stenneth

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

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

2
Abhishek

Prim est mieux pour les graphes plus denses, et nous n’avons pas non plus à accorder beaucoup d’attention aux cycles en ajoutant un Edge, car nous traitons principalement de nœuds. Prim est plus rapide que Kruskal dans le cas de graphiques complexes.

2
Sakshi