¿Es conocida esta versión densa del algoritmo de Kruskal?

15

Hace aproximadamente un año, un amigo y yo pensamos en una forma de implementar el algoritmo de Kruskal para gráficos densos en un límite mejor que el habitual (sin suponer aristas previamente ordenadas). Específicamente, logramos en todos los casos, similar a Prim cuando se implementa usando matrices de adyacencia.O(metroIniciar sesiónmetro)Θ(norte2)

He publicado un poco sobre el algoritmo en mi blog , incluido el código C ++ y los puntos de referencia, pero esta es la idea general:

  • Mantenga un nodo representativo para cada componente conectado. Inicialmente, todos los nodos se representan a sí mismos.

  • Mantenga un vector dist[i]tal que, para cada componente i, tenga el incidente de borde de cruce de componente más ligero i.

  • Cuando encuentre el borde más ligero que cruza las particiones, simplemente encuentre ique minimiza el peso de dist[i], en tiempo lineal.

  • Al unir dos componentes y , modifique la matriz de adyacencia , de modo que ahora para todos los componentes k , y marque i ya no es representativo de su componente conectado ( ahora solo quedará j ).CyoCjUNUNyo,k=min{UNyo,k,UNj,k}kyoj

La contratación del borde más ligero y el hallazgo de dicho borde se pueden hacer en tiempo lineal. Hacemos esto norte-1 veces para encontrar el MST. Se necesita un poco de contabilidad para encontrar realmente qué borde queremos agregar al MST, pero no aumenta la complejidad. Por lo tanto, el tiempo de ejecución es Θ(norte2) . La implementación es solo un par de bucles for.

¿Es esta versión de Kruskal conocida en la literatura?

Federico Lebrón
fuente

Respuestas:

19

No estoy seguro de este método específico para lograr el tiempo , pero en mi artículo se dan dos métodos diferentes para realizar Kruskal en el tiempo "Agrupamiento jerárquico rápido y otras aplicaciones de pares dinámicos más cercanos "(SODA 1998, arXiv: cs.DS / 9912014 y J. Experimental Algorithms 2000):O(norte2)O(norte2)

  1. Utilice Prim – Dijkstra – Jarník en su lugar y luego ordene los bordes para obtener la secuencia de inserción que Kruskal le daría, o

  2. Utilice la estructura de datos del par más cercano de Quadtree descrita en el documento, y vea a Kruskal como un procedimiento de agrupamiento aglomerativo estándar donde fusionamos los dos grupos más cercanos en un supercúmulo en cada paso, con "más cercano" definido como la longitud del borde más corto que conecta dos grupos .

La solución 2 es similar en espíritu a lo que usted describe, pero los detalles de cómo realizar un seguimiento de las distancias entre los grupos son ligeramente diferentes. Mantiene los mínimos en filas de la matriz de distancia del clúster, lo que le permite escanear esta lista de mínimos de fila en tiempo lineal para encontrar el mínimo global, mientras que mi papel superpone un árbol cuádruple en la misma matriz y realiza un seguimiento del mínimo en cada Quadtree Square. Su método es más simple, pero menos flexible para algunos otros problemas de pares dinámicos más cercanos (depende del hecho de que la fusión de dos grupos causa que disminuyan sus distancias a otros grupos, cierto para este problema pero no necesariamente para otros).

Como escribí en 2011 en el artículo de Wikipedia sobre el algoritmo de la cadena del vecino más cercano , ese algoritmo también se puede usar para realizar Kruskal en el tiempo . Sin embargo (a diferencia de algunas otras aplicaciones del algoritmo de cadena vecino más cercano) no obtiene un ahorro de espacio, por lo que (como el método quadtree y su método) el espacio sigue siendo . Por el contrario, la clasificación Prim + puede usar solo el espacio más allá del necesario para almacenar la entrada.O(norte2)O(norte2)O(norte)

David Eppstein
fuente