Quand dois-je utiliser Kruskal par opposition à Prim (et vice versa)?
Je me demandais quand il faut utiliser L'algorithme de Prim et quand Kruskal de l' pour trouver le minimum spanning tree? Ils ont tous les deux facile logiques, même le pire des cas, et la seule différence est l'application qui pourrait impliquer un peu différentes structures de données. Alors, quel est le facteur décisif?
Vous devez vous connecter pour publier un commentaire.
Utilisation de l'algorithme de Prim lorsque vous avez un graphique avec beaucoup d'arêtes.
Pour un graphe avec V sommets E bords, de Kruskal algorithme s'exécute en O(E log V) du temps et de l'algorithme de Prim pouvez exécuter dans O(E + V log V) amorti temps, si vous utilisez un Tas De Fibonacci.
De l'algorithme de Prim est nettement plus rapide dans la limite quand vous avez un très denses graphique avec beaucoup plus d'arêtes que de sommets. Kruskal fonctionne mieux dans des situations typiques (sparse graphiques) car il utilise plus simple des structures de données.
O(E α(V))
, oùα
est l'inverse de la fonction d'Ackermann (dans des cas pratiques, toujours moins de 5, puisque cette valeur n'est jamais obtenu par le nombre prévu d'atomes dans l'univers).J'ai trouvé un très beau sujet sur le net qui explique la différence d'une manière très simple : http://www.thestudentroom.co.uk/showthread.php?t=232168.
Kruskal algorithme va croître une solution de la moins chère bord en ajoutant le côté le moins cher bord, à condition qu'il ne crée pas de cycle.
De l'algorithme de Prim va croître d'une solution à partir d'un hasard vertex en ajoutant le côté le moins cher sommet, le sommet n'est pas actuellement dans la solution, mais auquel il est relié par le moins cher le bord.
Ci-joint est intéressant de feuille sur le sujet.
Si vous implémentez de Kruskal et de Prim, dans leur forme optimale : avec un syndicat trouver et un finbonacci tas respectivement, alors vous remarquerez combien de Kruskal est facile à mettre en œuvre par rapport à Prim.
Prim est plus difficile avec un tas de fibonacci, principalement parce que vous avez à maintenir un livre de maintien de table pour enregistrer la bi-directionnelle lien entre les noeuds d'un graphe et tas de nœuds. Avec un Syndicat Trouver, c'est le contraire, la structure est simple et peut même produire directement le mst à presque aucun coût supplémentaire.
V-1
bords.Je sais que vous n'avez pas demandé, mais si vous avez plus d'unités de traitement, vous devez toujours tenir compte de Borůvka de l'algorithme de, car il peut être facilement parallélisable - elle a donc un avantage de performance de plus de Kruskal et Jarník-algorithme de Prim.
Kruskal peut avoir de meilleures performances si les bords peuvent être triés dans le temps linéaire, ou sont déjà triés.
Prim est mieux si le nombre d'arêtes, de sommets est élevé.
Si l'on arrête l'algorithme au moyen de l'algorithme de prim génère toujours connecté arbre, mais kruskal sur l'autre main peut donner déconnecté de l'arbre ou la forêt
Kruskal temps de la complexité pire cas est O(E log E),parce que nous avons besoin de trier les bords.
Prim temps de la complexité pire cas est O(E log V) avec file d'attente de priorité ou encore mieux, O(E+V log V) avec Tas de Fibonacci.
Nous devrions utiliser Kruskal quand le graphe est peu dense, je.e.petit nombre de bords,comme E=O(V),lorsque les bords sont déjà triés ou si nous pouvons faire le tri dans le temps linéaire.
Nous devrions utiliser Prim quand le graphe est dense, je.e nombre d'arêtes est élevée ,comme E=O(V2).
Une application importante de l'algorithme de Kruskal est dans seul lien de clustering.
Envisager de n sommets et vous avez un graphe complet.Pour obtenir un k clusters de ces n points.Exécuter l'algorithme de Kruskal sur le premier n-(k-1) les bords de la triés ensemble d'arêtes.Vous obtenez k-cluster du graphique avec espacement maximal.
Le meilleur moment pour Kruskal est O(E logV). Pour Prim est à l'aide de fib tas nous pouvons obtenir O(E+V lgV). Donc sur un dense graphique, Prim est beaucoup mieux.
Prim est mieux pour plus denses graphes, et en cela, nous avons également ne pas avoir à payer beaucoup d'attention à la longueur des cycles de l'ajout d'un bord, comme nous sommes principalement affaire avec des nœuds. Prim est plus rapide que de Kruskal dans le cas de graphiques complexes.
De kruskal Algorithme nous avons nombre d'arêtes et le nombre de sommets d'un graphe, mais sur chaque bord, nous avons une certaine valeur ou le poids au nom de laquelle nous pouvons préparer un nouveau graphique qui ne doit pas être cyclique ou non à proximité de n'importe quel côté
Par Exemple
graphique comme ceci
_____________
| | |
| | |
|__________| |
Donner le nom d'un sommet quelconque a,b,c,d,e,f .