Buenas, les dejo un resumen de los pasos que dimos en el práctico pasado sobre el análisis del tiempo de ejecución de un algoritmo (GS en este caso). Aunque intenté darle un tratamiento general, tengan en cuenta el contexto de estos comentarios ya que se hacen muchas simplificaciones para lograr resumir.
Tenemos un problema P tiene un conjunto de instancias E. Suponemos que en E hay dos instancias particulares e1 y e2, y un algoritmo A que resuelve P (en este análisis no hablaremos de la complejidad de P, solo de A). Para el algoritmo A tenemos por ejemplo dos implementaciones I1 e I2.
- El libro probó que una I1 es O(n2) mostrando que para todas las instancias de E el tiempo de ejecución es O(n2). Por lo tanto A es O(n2) (logré encontrar una implementación que lo resuelve en ese tiempo para todo e perteneciente a E). Pero I2 pordría ser Ω(n3) y no cambiaría la afirmación sobre A.
- Si I1 es O(n2) puede ser o(n2) también. Para probar que I1 no es o(n2) hay que mostrar que es Ω(n2) .
- En este punto no sabemos si I1 es Ω(n2) y tampoco sabemos si A es Ω(n2) (sabemos que A es O(n2) , pero A puede ser o(n2) también y por lo tanto la cota superior que probó el libro no ser la mejor).
- En el práctico probamos que I1 es Ω(n2), encontrando una instancia e1 (o cierta estructura de instancia más precisamente) que hace que I1 demore tiempo Ω(n2) . Podría sin embargo existir una e2 que ejecutada en I1 demore tiempo O(n), pero con eso no podemos afirmar que I1 es O(n) (tendriamos que mostrarlo para todo e perteneciente a E, que de hecho no es cierto porque mostramos que no lo cumple e1 ).
- Al probar el tiempo Ω(n2) de I1 no podemos estar seguro de la no existencia otra I2 cuyo tiempo de ejecucion sea o(n2). Por lo anterior, en este punto todavia no sabemos si A es Ω(n2).
- Para probar que no va a existir otra I2 que sea o(n2), en la parte b) del práctico se prueba que A es Ω(n2), usando los lemas del libro y una instancia (se usó la misma e1 pero puede ser otra).
Resumiendo,
para que una implementacion sea O(n2) debe serlo para todas las instancias.
Para que un algoritmo sea O(n2) alcanza con mostrar una implementacion O(n2) .
Para que una implementación sea Ω(n2) alcanza con una instancia en la cual se demore Ω(n2).
Si un algoritmo es Ω(n2) debe serlo para todas las implementaciones posibles.