Probar la complejidad
Con el método que hacemos en papel, usamos E-K sobre la matriz para ir aumentando el matching inicial. Esto lo vamos a hacer a los sumo n veces(pues hay n lados en el matching perfecto que buscamos.)
Como el matching inicial cuesta
¿Cual es la complejidad de extender en un lado el matching? Si solo pensamos en la búsqueda de un camino aumentante de tamaño mínimo, tenemos que el costo es
Hasta ahora, la complejidad total del húngaro sería
Pero todavía tenemos que tener en cuenta que para cada vez que extendemos en 1 el matching, también es posible que tengamos que agregar un lado haciendo una serie de cambios de matriz.
Sea CM el costo de un cambio de matriz y T la máxima cantidad de cambios de matriz necesarios para agregar un lado, el costo total del algoritmo es:
CM consiste en
- Calcular la constante
- Restar
de S - Sumarlo
a
El cálculo de
Restarlo de las filas es
Sumarlo a
Por lo tanto la complejidad de CM es
Ahora veamos de acotar T.
Propiedad clave: después de un cambio de matriz, o crecen las filas etiquetadas o extendemos el matching(o ambas).
Eso lo podemos ver si analizamos que pasa cuando calculamos que
Con esta propiedad tenemos que
Entonces, reemplazando:
Dada la cuenta de arriba, vemos que si CM costara O(n), entonces tendríamos una complejidad de n^3. Para lograr esto, podemos hacer que el cálculo de m sea O(n) y también lograr que restar a las filas S y sumar a las
Para lo primero, podemos tener pre-calculado el mínimo de cada fila de S, por ejemplo, esto se podría hacer cuando se está revisando una fila en la búsqueda anterior al cambio de matriz.
Por otro lado podemos en lugar de restar/sumar a todas las entradas, mantener un array con los valores que habría que sumarle/restarle a cada fila y columna. Esto nos da un costo O(n). Luego al buscar 0's, lugar de la guarda
La complejidad queda: