Aprendizaje Interactivo de Teoría de Grafos
Aprendizaje Interactivo de Teoría de Grafos
Guest User
Using app without sign in
Calculadora paralela de árbol de expansión mínima
Cada componente elige a la vez su arista saliente más barata, en rondas paralelas
Selecciona un algoritmo y genera pasos para comenzar la visualización
El algoritmo de Boruvka, publicado en 1926 y el más antiguo para MST, halla un árbol de expansión mínima dejando que cada componente elija simultáneamente su arista saliente más barata. Todas las aristas elegidas se añaden a la vez, fusionando componentes en rondas paralelas.
Cada ronda examina todas las aristas y registra, para cada componente, la arista de menor peso que la abandona. Esas aristas se añaden al bosque, reduciendo al menos a la mitad el número de componentes, por lo que solo se necesitan O(log V) rondas. Cada ronda cuesta O(E), para un total de O(E log V). Como cada ronda es un simple recorrido paralelo, Boruvka es la base natural del cálculo de MST paralelo y distribuido.
El algoritmo de Boruvka se ideó originalmente para planificar una red eléctrica en Moravia y hoy sustenta implementaciones paralelas de MST en GPU y clústeres, así como algoritmos híbridos que combinan rondas de Boruvka con fases de Prim o Kruskal. En entrevistas aparece sobre todo como punto de discusión sobre diseño de algoritmos paralelos.
Cada componente elige su propia arista saliente más barata, y todas esas elecciones se aplican a la vez. Rondas en lugar de pasos, que es lo que lo hace paralelizable.
Boruvka(grafo):
hacerConjunto(v) para cada vértice
mst = []
mientras quede más de una componente:
masBarata = {} // por componente
para cada arista (u, v, w):
a = buscar(u); b = buscar(v)
si a == b: continuar // arista interna
si w < masBarata[a]: masBarata[a] = (u,v,w)
si w < masBarata[b]: masBarata[b] = (u,v,w)
para cada arista e en masBarata.valores():
si buscar(e.u) != buscar(e.v): // quizá ya unidas
unir(e.u, e.v); mst.añadir(e)La guarda del segundo bucle es esencial, no defensiva. Dos componentes eligen con frecuencia la misma arista, una desde cada extremo, y aplicarla dos veces añadiría un duplicado. La corrección exige que los pesos de las aristas sean distintos, o un criterio de desempate consistente como comparar identificadores: sin él, varias componentes pueden elegir cada una una arista distinta de igual peso y formar juntas un ciclo.
Construye el árbol de expansión mínimo sobre el mismo grafo usado para Prim y Kruskal, de modo que puedan compararse los tres.
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 A-B, B-C y C-D con peso total 2 + 1 + 4 = 7, el mismo árbol que produjeron Prim y Kruskal. Boruvka llegó allí en una ronda en lugar de tres pasos secuenciales, y ese es el punto: cada ronda al menos reduce a la mitad el número de componentes, ya que toda componente se fusiona con al menos otra, de modo que nunca hacen falta más de O(log V) rondas.
Tiempo: O(E log V) · Espacio: O(V + E)
Cada ronda recorre todas las aristas una vez con O(E) para hallar la arista saliente más barata por componente. Toda componente se fusiona con al menos otra durante una ronda, así que el número de componentes al menos se reduce a la mitad, lo que significa que ocurren a lo sumo log base 2 de V rondas. Multiplicando se obtiene O(E log V), igual que Prim y Kruskal. La propiedad distintiva es que dentro de una ronda cada componente trabaja de forma independiente, así que el recorrido se paraleliza directamente, y por eso Boruvka sustenta las implementaciones de MST en GPU y distribuidas mientras que Prim y Kruskal, inherentemente secuenciales, no. Los algoritmos híbridos ejecutan unas pocas rondas de Boruvka para encoger el grafo y luego cambian a Prim.
Los tres algoritmos clásicos de MST cuestan O(E log V). La diferencia es estructural.
| Alternativa | Prefiérela cuando | Coste |
|---|---|---|
| Algoritmo de Prim | Código secuencial sobre un grafo denso. Un árbol, una cola de prioridad, sencillo de implementar. | O(E log V) o O(V^2) |
| Algoritmo de Kruskal | Grafos dispersos o aristas preordenadas, y grafos desconectados donde un bosque es aceptable. | O(E log E) |
| Boruvka | Ejecución paralela o distribuida, ya que cada ronda es un recorrido independiente por componente. | O(E log V) |
| Híbrido Boruvka más Prim | Grafos muy grandes. Unas pocas rondas de Boruvka contraen el grafo y luego Prim termina sobre el más pequeño. | O(E log log V) en la práctica |
Leer el artículo completo: Minimum Spanning Trees: Prim, Kruskal and Boruvka
Algoritmos relacionados: Algoritmo de Prim, Algoritmo de Kruskal