Aprendizaje Interactivo de Teoría de Grafos
Aprendizaje Interactivo de Teoría de Grafos
Guest User
Using app without sign in
Calculadora de árbol de expansión mínima
Añade las aristas en orden de peso, rechazando las que cierran un ciclo
Selecciona un algoritmo y genera pasos para comenzar la visualización
El algoritmo de Kruskal halla un árbol de expansión mínima considerando las aristas en orden creciente de peso y añadiendo cada arista que no cree un ciclo. A diferencia del enfoque de crecimiento de árbol de Prim, Kruskal hace crecer un bosque de componentes que se fusionan gradualmente en un solo árbol.
Tras ordenar todas las aristas por peso, el algoritmo las recorre de menor a mayor. Para cada arista usa una estructura Union-Find (conjuntos disjuntos) para comprobar en tiempo casi constante si los dos extremos ya están en la misma componente. Si no lo están, la arista se acepta y las componentes se fusionan; de lo contrario se descarta como arista de ciclo. La ordenación domina el coste, dando O(E log E) tiempo.
El algoritmo de Kruskal se prefiere para grafos dispersos y problemas con aristas ya ordenadas, como el agrupamiento de enlace simple, la segmentación de imágenes y el diseño de redes por niveles de coste. La estructura Union-Find incorporada es en sí misma un tema de entrevista destacado, que cubre compresión de caminos y unión por rango.
Ordena todas las aristas por peso y luego recorre la lista añadiendo cualquier arista que una dos componentes distintas. Union-Find hace que la comprobación de "componentes distintas" resulte casi gratuita.
Kruskal(grafo):
ordenar todas las aristas por peso ascendente
hacerConjunto(v) para cada vértice v
mst = []
para cada arista (u, v, w) en orden:
si buscar(u) != buscar(v): // componentes distintas
unir(u, v)
mst.añadir((u, v, w))
si mst tiene V - 1 aristas: salir
devolver mstKruskal hace crecer un bosque, no un árbol. Varios fragmentos desconectados se desarrollan de forma independiente y se fusionan a medida que aristas baratas los unen, que es la diferencia estructural con Prim y la razón de que Kruskal maneje grafos desconectados sin esfuerzo: simplemente devuelve un bosque de expansión mínimo. La corrección se sigue de la propiedad del corte aplicada a las fronteras entre componentes, exactamente igual que con Prim.
Construye el árbol de expansión mínimo sobre el mismo grafo usado en el ejemplo de Prim, para poder comparar los dos órdenes de descubrimiento.
Grafo de ejemplo: Aristas no dirigidas A-B (2), A-C (3), B-C (1), C-D (4) y B-D (7).
El árbol de expansión mínimo es B-C, A-B y C-D con peso total 1 + 2 + 4 = 7, idéntico al que produjo Prim desde A. Los árboles coinciden, como debe ocurrir cuando los pesos son distintos, pero el orden de descubrimiento difiere: Prim fue A-B, B-C, C-D creciendo hacia afuera desde A, mientras que Kruskal fue B-C, A-B, C-D en puro orden de peso y tuvo que rechazar explícitamente una arista que cerraba ciclo por el camino.
Tiempo: O(E log E) · Espacio: O(V + E)
Ordenar las aristas domina todo lo demás con O(E log E), que equivale a O(E log V) ya que E es a lo sumo V al cuadrado y por tanto log E queda dentro de un factor constante de log V. Tras la ordenación, el bucle realiza a lo sumo 2E operaciones de búsqueda y V - 1 uniones. Con compresión de caminos y unión por rango, cada una cuesta la función inversa de Ackermann de V, que está por debajo de 5 para cualquier entrada que quepa en memoria y se trata como constante. Así que la parte de Union-Find es efectivamente O(E) y la ordenación es todo el coste. Cuando las aristas llegan ya ordenadas, o pueden repartirse en cubetas porque los pesos son enteros pequeños, Kruskal baja a casi lineal y supera claramente a Prim.
Kruskal y Prim resuelven el mismo problema. La densidad, el orden de las aristas y la conectividad deciden cuál es mejor.
| Alternativa | Prefiérela cuando | Coste |
|---|---|---|
| Algoritmo de Prim | Grafos densos, donde E se acerca a V al cuadrado y ordenar todas las aristas es un desperdicio. | O(E log V) o O(V^2) |
| Algoritmo de Boruvka | Quieres paralelizar. Cada componente elige a la vez su arista saliente más barata. | O(E log V) |
| Kruskal con ordenación por cubetas | Los pesos son enteros pequeños, así que la ordenación pasa a ser lineal y Kruskal casi lineal en conjunto. | O(E·α(V)) |
| Bosque de expansión mínimo | El grafo está desconectado. Kruskal ya hace esto sin ninguna modificación. | O(E log E) |
Leer el artículo completo: Minimum Spanning Trees: Prim, Kruskal and Boruvka
Algoritmos relacionados: Algoritmo de Prim, Algoritmo de Boruvka, Detección de Ciclos