El algoritmo de eliminación inversa es un algoritmo de la teoría de grafos que se utiliza para obtener un árbol de expansión mínima a partir de un grafo conexo con ponderación de aristas . Apareció por primera vez en Kruskal (1956) , pero no debe confundirse con el algoritmo de Kruskal , que aparece en el mismo artículo. Si el grafo está desconectado, este algoritmo encontrará un árbol de expansión mínima para cada parte desconectada del grafo. El conjunto de estos árboles de expansión mínima se denomina bosque de expansión mínima, que contiene todos los vértices del grafo.
Este algoritmo es un algoritmo voraz , que elige la mejor opción en cualquier situación. Es el inverso del algoritmo de Kruskal , otro algoritmo voraz para encontrar un árbol de expansión mínima. El algoritmo de Kruskal comienza con un grafo vacío y añade aristas, mientras que el algoritmo de eliminación inversa comienza con el grafo original y elimina aristas del mismo. El algoritmo funciona de la siguiente manera:
- Comencemos con el grafo G, que contiene una lista de aristas E.
- Recorre la letra E en orden decreciente de pesos de arista.
- Para cada arista, compruebe si al eliminarla se producirá una mayor desconexión del grafo.
- Realice cualquier eliminación que no provoque una desconexión adicional.
Pseudocódigo
La función ReverseDelete(edges[] E ) ordena E en orden descendente . Definir un índice i ← 0 mientras i < tamaño ( E ) hacer Definir arista ← E [ i ] eliminar E [ i ] si el grafo no está conectado entonces E [ i ] ← arista i ← i + 1 devolver bordes[] E
En el gráfico anterior, el conjunto de aristas E , donde cada arista contiene un peso y vértices conectados v1 y v2 .
Ejemplo
En el siguiente ejemplo, el algoritmo evalúa los bordes verdes y elimina los bordes rojos.
Tiempo de ejecución
Se puede demostrar que el algoritmo se ejecuta en tiempo O ( E log V (log log V ) 3 ) (usando la notación O grande ), donde E es el número de aristas y V es el número de vértices. Esta cota se logra de la siguiente manera:
- Ordenar los bordes por peso usando una ordenación por comparación lleva un tiempo de O ( E log E ), que se puede simplificar a O ( E log V ) usando el hecho de que el mayor E que puede ser es V 2 .
- Hay E iteraciones del bucle.
- Eliminar una arista, comprobar la conectividad del grafo resultante y (si está desconectado) volver a insertar la arista se puede hacer en un tiempo de O (log V (log log V ) 3 ) por operación ( Thorup 2000 ) .
Prueba de corrección
Se recomienda leer primero la demostración del algoritmo de Kruskal .
La demostración consta de dos partes. Primero, se demuestra que las aristas que quedan después de aplicar el algoritmo forman un árbol de expansión. Segundo, se demuestra que el árbol de expansión tiene un peso mínimo.
Árbol de expansión
El subgrafo restante (g) generado por el algoritmo no está desconectado, ya que el algoritmo lo verifica en la línea 7. El subgrafo resultante no puede contener un ciclo, puesto que, de ser así, al recorrer las aristas encontraríamos la arista máxima del ciclo y la eliminaríamos. Por lo tanto, g debe ser un árbol generador del grafo principal G.
Minimalismo
Demostramos que la siguiente proposición P es verdadera por inducción: Si F es el conjunto de aristas que quedan al final del bucle while , entonces existe algún árbol de expansión mínima que (sus aristas) son un subconjunto de F.
- Claramente, P se cumple antes del inicio del bucle while. Dado que un grafo conexo ponderado siempre tiene un árbol de expansión mínima y dado que F contiene todas las aristas del grafo, entonces este árbol de expansión mínima debe ser un subconjunto de F.
- Ahora supongamos que P es verdadera para algún conjunto de aristas no final F y sea T un árbol de expansión mínimo que está contenido en F. Debemos demostrar que después de eliminar la arista e en el algoritmo existe algún (posiblemente otro) árbol de expansión T' que es un subconjunto de F.
- Si la siguiente arista eliminada e no pertenece a T, entonces T=T' es un subconjunto de F y se cumple P.
- De lo contrario, si e pertenece a T: primero observe que el algoritmo solo elimina las aristas que no causan una desconexión en F. Por lo tanto, e no causa una desconexión. Pero eliminar e causa una desconexión en el árbol T (ya que es un miembro de T). Supongamos que e separa T en subgrafos t1 y t2. Dado que todo el grafo está conectado después de eliminar e, entonces debe existir un camino entre t1 y t2 (distinto de e) por lo que debe existir un ciclo C en F (antes de eliminar e). Ahora debemos tener otra arista en este ciclo (llamémosla f) que no está en T pero sí en F (ya que si todas las aristas del ciclo estuvieran en el árbol T, entonces ya no sería un árbol). Ahora afirmamos que T' = T - e + f es el árbol de expansión mínima que es un subconjunto de F.
- Primero demostramos que T' es un árbol de expansión . Sabemos que al eliminar una arista en un árbol y agregar otra que no genere un ciclo, obtenemos otro árbol con los mismos vértices. Dado que T era un árbol de expansión, T' también debe serlo . Esto se debe a que agregar "f" no genera ciclos, ya que se elimina "e" (nótese que el árbol T contiene todos los vértices del grafo).
- En segundo lugar, demostramos que T' es un árbol de expansión mínima . Tenemos tres casos para las aristas "e" y "f". wt es la función de peso .
- wt( f ) < wt( e ) esto es imposible ya que esto hace que el peso del árbol T' sea estrictamente menor que T . dado que T es el árbol de expansión mínima, esto es simplemente imposible.
- wt( f ) > wt( e ) esto también es imposible. ya que entonces cuando recorremos los bordes en orden decreciente de pesos de borde debemos ver " f " primero. como tenemos un ciclo C, eliminar " f " no causaría ninguna desconexión en F. por lo que el algoritmo lo habría eliminado de F antes. por lo tanto, " f " no existe en F lo cual es imposible (hemos demostrado que f existe en el paso 4.
- entonces wt(f) = wt(e) por lo que T' también es un árbol de expansión mínima . por lo tanto, nuevamente se cumple P.
- por lo tanto P se cumple cuando el bucle while termina (que es cuando hemos visto todas las aristas) y demostramos al final que F se convierte en un árbol de expansión y sabemos que F tiene un árbol de expansión mínimo como subconjunto. por lo tanto F debe ser el árbol de expansión mínimo en sí mismo.
Véase también
Referencias
- Kleinberg, Jon; Tardos, Éva (2006), Diseño de algoritmos , Nueva York: Pearson Education, Inc..
- Kruskal, Joseph B. (1956), "Sobre el subárbol de expansión más corto de un grafo y el problema del viajante de comercio", Actas de la Sociedad Matemática Americana , 7 (1): 48– 50, doi : 10.2307/2033241 , JSTOR 2033241 .
- Thorup, Mikkel (2000), "Conectividad de grafos totalmente dinámica casi óptima", Actas del 32.º Simposio ACM sobre Teoría de la Computación , págs. 343–350 , doi : 10.1145/335305.335345 .
- Algoritmos de grafos
- Árbol de expansión