En ciencias de la computación y teoría de grafos, el algoritmo de Karger es un procedimiento probabilista para calcular un corte mínimo de un grafo conexo. Fue ideado por David Karger y publicado por primera vez en 1993.[1]
La idea del algoritmo se basa en el concepto de contracción de una arista en un grafo no dirigido . Informalmente, la contracción de una arista fusiona los nodos y en uno, reduciendo el número total de nodos del grafo en uno. Todas las demás aristas que conectan o se reunirán al nodo fusionado, produciendo efectivamente un multigrafo. El algoritmo básico de Karger contrae iterativamente aristas elegidas aleatoriamente hasta que solo quedan dos nodos. Estos nodos representan un corte en el grafo original. Al iterar este algoritmo básico un número suficiente de veces, se puede encontrar un corte mínimo con alta probabilidad.
Un corte en un grafo no dirigido es una partición de los vértices en dos conjuntos no vacíos y disjuntos . El conjunto de cortes de un corte consiste en las aristas entre las dos partes. El tamaño (o peso) de un corte en un grafo no ponderado es la cardinalidad del conjunto de cortes, es decir, el número de aristas entre las dos partes.
Existen maneras para determinar si cada vértice pertenece a o a , pero dos de estas opciones hacen que o sean intersecciones vacías y no generan cortes. Entre las opciones restantes, intercambiar los roles de y no altera el corte, por lo que cada corte se cuenta dos veces; por lo tanto, hay cortes distintos. El problema del corte mínimo consiste en encontrar el corte de menor tamaño entre estos cortes.
Para grafos ponderados con pesos de arista positivos , el peso del corte es la suma de los pesos de las aristas entre los vértices de cada parte
lo que concuerda con la definición no ponderada de .
Un corte a veces se denomina corte global para distinguirlo de un corte - para un par de vértices dado, que tiene el requisito adicional de que y . Todo corte global es un corte - para algún . Por lo tanto, el problema del corte mínimo se puede resolver en tiempo polinómico iterando sobre todas las opciones de y resolviendo el problema de corte mínimo resultante - utilizando el teorema de flujo máximo y corte mínimo y un algoritmo de tiempo polinómico para el flujo máximo, como el algoritmo de inserción y reetiquetado, aunque este enfoque no es óptimo. Entre los mejores algoritmos deterministas para el problema de corte mínimo global se encuentra el algoritmo de Stoer-Wagner, cuyo tiempo de ejecución es .[2]
La operación fundamental del algoritmo de Karger es una variante de la contracción de aristas. El resultado de contraer la arista es un nuevo nodo . Cada arista o para hasta los extremos de la arista contraída se reemplaza por una arista hasta el nuevo nodo. Finalmente, se eliminan los nodos contraídos y con todas sus aristas incidentes. En particular, el grafo resultante no contiene bucles propios. El resultado de contraer la arista se denota como .
El algoritmo de contracción contrae repetidamente aristas aleatorias en el grafo hasta que solo quedan dos nodos, momento en el cual solo hay un corte.
La idea clave del algoritmo es que es mucho más probable que las aristas que no son de corte mínimo se seleccionen aleatoriamente y se pierdan por contracción, ya que las aristas con corte mínimo suelen ser ampliamente superadas en número por las aristas que no son de corte mínimo. Posteriormente, es plausible que las aristas con corte mínimo sobrevivan a toda la contracción de aristas, y el algoritmo identificará correctamente la arista con corte mínimo.
procedimiento contraer( ): mientras elegir uniformemente al azar devolver el único corte en
Cuando el grafo se representa utilizando una lista de adyacencia o una matriz de adyacencia, se puede utilizar una sola operación de contracción de aristas con un número lineal de actualizaciones a la estructura de datos, para un tiempo de ejecución total de . Alternativamente, el procedimiento puede considerarse como una ejecución del algoritmo de Kruskal para construir el árbol recubridor mínimo en un grafo donde las aristas tienen pesos según una permutación aleatoria . Eliminar la arista más pesada de este árbol da como resultado dos componentes que describen un corte. De esta manera, el procedimiento de contracción se puede disponer como el algoritmo de Kruskal en el tiempo .
Los desarrollos más conocidos utilizan tiempo y espacio de memoria, o tiempo y espacio, respectivamente.[1]
En un grafo con vértices, el algoritmo de contracción devuelve un corte mínimo con una probabilidad polinómicomente pequeña, . Debe recordarse que todo grafo tiene cortes (según lo explicado en la sección anterior), entre los cuales pueden ser, como máximo, cortes mínimos. Por lo tanto, la probabilidad de éxito de este algoritmo es mucho mejor que la probabilidad de elegir un corte al azar, que es, como máximo, .
Por ejemplo, un grafo ciclo con vértices tiene exactamente cortes mínimos, dados por cada elección de 2 aristas. El procedimiento de contracción encuentra cada uno de estos con la misma probabilidad.
Para establecer con mayor precisión el límite inferior de la probabilidad de éxito, sea el conjunto de las aristas con un corte mínimo específico de tamaño . El algoritmo de contracción devuelve si ninguna de las aristas aleatorias eliminadas por el algoritmo pertenece al conjunto de cortes . En particular, la primera contracción de arista evita , lo que ocurre con una probabilidad de . El grado mínimo de es al menos (de lo contrario, un vértice de grado mínimo induciría un corte más pequeño donde una de las dos particiones contiene solo el vértice de grado mínimo), por lo que . Por lo tanto, la probabilidad de que el algoritmo de contracción elija una arista de es:
La probabilidad de que el algoritmo de contracción en un grafo de -vértices evite satisface la recurrencia , con , que puede expandirse como:
Al repetir el algoritmo de contracción veces con elecciones aleatorias independientes y obtener el corte más pequeño, la probabilidad de no encontrar un corte mínimo es:
El tiempo total de ejecución para repeticiones para un grafo con vértices y aristas es .
Una extensión del algoritmo de Karger, debida a David Karger y a Clifford Stein, logra una mejora de un orden de magnitud.[3]
La idea básica es realizar el procedimiento de contracción hasta que el grafo alcance vértices.
procedimiento contrato( , ): mientras elegir uniformemente al azar devolver
La probabilidad de que este procedimiento de contracción evite un corte específico en un grafo de -vértices es:
Esta expresión es aproximadamente y se vuelve menor que alrededor de . En particular, la probabilidad de que una arista de se contraiga aumenta hacia el final. Esto motiva la idea de cambiar a un algoritmo más lento después de un cierto número de pasos de contracción.
procedimiento fastmincut( ): si : devolver contrato( , ) de lo contrario: contrato( , ) contrato( , ) devolver minfastmincut( ), fastmincut( )
El parámetro de contracción se elige de modo que cada llamada a la contracción tenga una probabilidad de al menos la mitad de éxito (es decir, de evitar la contracción de una arista de un conjunto de corte específico ). Esto permite modelar la parte exitosa del árbol de recursión como un árbol binario aleatorio generado por un proceso de Galton-Watson crítico, y analizarlo en consecuencia.[3]
La probabilidad de que este árbol aleatorio de llamadas exitosas contenga una ruta lo suficientemente larga como para llegar a la base de la recursión y encontrar viene dada por la relación de recurrencia
con solución . El tiempo de ejecución del corte rápido mínimo satisface que
con solución . Para alcanzar la probabilidad de error , el algoritmo puede repetirse veces, para un tiempo de ejecución total de . Esto supone una mejora de un orden de magnitud con respecto al algoritmo original de Karger.[3]
Para determinar un corte mínimo, se debe tocar cada arista del grafo al menos una vez, lo que equivale a un tiempo en un grafo denso. El algoritmo de corte mínimo de Karger-Stein requiere un tiempo de ejecución de , que es muy cercano a este.