¿Cuándo debo usar Kruskal en lugar de Prim (y viceversa)?

Respuestas:

199

Use el algoritmo de Prim cuando tenga un gráfico con muchos bordes.

Para un gráfico con vértices V y bordes E , el algoritmo de Kruskal se ejecuta en tiempo O (E log V) y el algoritmo de Prim puede ejecutarse en tiempo amortizado O (E + V log V) , si utiliza un montón de Fibonacci .

El algoritmo de Prim es significativamente más rápido en el límite cuando tienes un gráfico realmente denso con muchos más bordes que vértices. Kruskal funciona mejor en situaciones típicas (gráficos dispersos) porque utiliza estructuras de datos más simples.

Todd Gamblin
fuente
8
Yo diría "situaciones típicas" en lugar de promedio. Creo que es un término oscuro para usar, por ejemplo, ¿cuál es el "tamaño promedio" de una tabla hash? ni idea.
yairchu
2
@SplittingField: creo que estás comparando manzanas y naranjas. El análisis amortizado es simplemente una forma de obtener una medición de la función (por así decirlo), ya sea que el peor de los casos o el caso promedio dependa de lo que esté probando. De hecho (como lo busco ahora), el artículo wiki usa un lenguaje que implica que solo se usa para el análisis del peor de los casos. Ahora, el uso de dicho análisis significa que no puede hacer promesas tan fuertes sobre el costo de una operación en particular, pero para el momento en que se realiza el algoritmo, O (E + VlogV) lo hará, incluso en el peor de los casos.
agorenst
10
Eso suena bien en teoría, pero apuesto a que pocas personas pueden implementar un montón de Fibonacci
Alexandru
2
@tgamblin, puede haber bordes C (V, 2) en el peor de los casos. Entonces, ¿la complejidad del tiempo del algoritmo de Prim no se reduce a O (V ^ 2 + VlogV), es decir, O (V ^ 2) en el caso del montón de Fibonacci?
Duende verde el
77
También hay otro factor importante: la salida de Prims es un MST solo si el gráfico está conectado (la salida me parece inútil de otro modo), pero la salida de Kruskal son los bosques de expansión mínima (con algún uso).
Andrei I
100

Encontré un hilo muy agradable en la red que explica la diferencia de una manera muy directa: http://www.thestudentroom.co.uk/showthread.php?t=232168 .

El algoritmo de Kruskal desarrollará una solución desde el borde más barato al agregar el siguiente borde más barato, siempre que no cree un ciclo.

El algoritmo de Prim desarrollará una solución a partir de un vértice aleatorio agregando el siguiente vértice más barato, el vértice que actualmente no está en la solución pero que está conectado a él por el borde más barato.

Aquí se adjunta una hoja interesante sobre ese tema.ingrese la descripción de la imagen aquíingrese la descripción de la imagen aquí

Si implementa Kruskal y Prim, en su forma óptima: con un hallazgo de unión y un montón de finbonacci respectivamente, notará cómo Kruskal es fácil de implementar en comparación con Prim.

Prim es más difícil con un montón de Fibonacci principalmente porque debe mantener una tabla de contabilidad para registrar el enlace bidireccional entre los nodos del gráfico y los nodos del montón. Con Union Find, es todo lo contrario, la estructura es simple e incluso puede producir directamente el material sin casi ningún costo adicional.

Snicolas
fuente
2
Nitpick: La última 'diapositiva' en cada uno debería leer "repetir hasta que tenga un árbol de expansión"; no hasta MST, que es una tarea recursiva, ¿cómo sé que es mínima? ¡Es por eso que sigo a Prim / Kruskal para empezar!
OJFord
@OllieFord Encontré este hilo por haber buscado una ilustración simple de los algoritmos Prim y Kruskal. Los algoritmos garantizan que encontrarás un árbol y que ese árbol es un MST. Y sabes que has encontrado un árbol cuando tienes exactamente los V-1 bordes.
mikedu95
@ mikedu95 Tienes razón, haciendo el mismo punto que mi comentario anterior desde un ángulo diferente.
OJFord
Pero no es una condición previa que solo tenga que elegir con un solo peso entre vértices, no puede elegir el peso 2 más de una vez del gráfico anterior, debe elegir el siguiente peso, por ejemplo: 3 @Snicolas
ani0904071
30

Sé que no solicitó esto, pero si tiene más unidades de procesamiento, siempre debe considerar el algoritmo de Borůvka , ya que podría ser fácilmente paralelo; por lo tanto, tiene una ventaja de rendimiento sobre el algoritmo Kruskal y Jarník-Prim.

malejpavouk
fuente
23

Kruskal puede tener un mejor rendimiento si los bordes se pueden ordenar en tiempo lineal o si ya están ordenados.

Prim es mejor si el número de aristas a vértices es alto.

Daniel C. Sobral
fuente
19

El peor caso de la complejidad del tiempo de Kruskal es O (E log E) , esto porque necesitamos ordenar los bordes. El peor caso de la complejidad del tiempo primario es O (E log V) con cola de prioridad o incluso mejor, O (E + V log V) con Fibonacci Heap . Deberíamos usar Kruskal cuando el gráfico es escaso, con un número pequeño de aristas, como E = O (V), cuando las aristas ya están ordenadas o si podemos ordenarlas en tiempo lineal. Deberíamos usar Prim cuando el gráfico es denso, es decir, el número de aristas es alto, como E = O (V²).

Ghiurutan Alexandru
fuente
Me parece que Prim nunca es peor que Kruskal en cuanto a velocidad. Como E debe ser al menos V-1, hay un árbol de expansión. Creo que la razón por la que podemos preferir Kruskal para un gráfico escaso es que su estructura de datos es muy simple.
Yu Gu
16

Si detenemos el algoritmo en el algoritmo de middle prim siempre genera un árbol conectado, pero kruskal por otro lado puede dar un árbol o bosque desconectado

Prakhar
fuente
5

Una aplicación importante del algoritmo de Kruskal es la agrupación en un solo enlace .

Considere n vértices y tendrá un gráfico completo. Para obtener ak agrupaciones de esos n puntos. Ejecute el algoritmo de Kruskal sobre los primeros n- (k-1) bordes del conjunto ordenado de bordes. Obtenga el k-cluster de la gráfica con el máximo espaciado.

Jaskaran
fuente
3

El mejor momento para Kruskal es O (E logV). Para Prim usando montones de fib podemos obtener O (E + V lgV). Por lo tanto, en un gráfico denso, Prim es mucho mejor.

Leon Stenneth
fuente
2

Prim es mejor para gráficos más densos, y en esto tampoco tenemos que prestar mucha atención a los ciclos agregando un borde, ya que estamos tratando principalmente con nodos. Prim es más rápido que Kruskal en el caso de gráficos complejos.

Sakshi
fuente
2

En el algoritmo de kruskal tenemos un número de aristas y un número de vértices en un gráfico dado, pero en cada borde tenemos algún valor o peso en nombre del cual podemos preparar un nuevo gráfico que no debe ser cíclico ni estar cerca de ningún lado. Por ejemplo

gráfico como este _____________ | El | El | El | El | El | | __________ | El | Dé nombre a cualquier vértice a, b, c, d, e, f.

Abhishek
fuente