sábado, marzo 11, 2006

Complejidad de "Alto Turmequé"

Aunque durante el curso que dirigí no vimos mucho de complejidad, pueden encontrar un buen tutorial aquí.

Bueno, aprovecho para hacerle propaganda a Computational Complexity, un buen blog sobre complejidad computacional. En palabras del Profesor Lance Fortnow, quien lo administra,

"en el blog se tratan temas de complejidad computacional y otros divertidos temas de matemáticas y ciencias de la computación"

Particularmente les recomiendo los siguientes "posts":
Para los que estén un poco perdidos, sobre todo en el tema de P vs NP, les recomiendo leer este artículo de Wikipedia.

Animaciones de Algoritmos de Ordenamiento

En este sitio y con unos cuantos "clicks" pueden comparar en términos de velocidad algunos algoritmos de ordenamiento. También está disponible el código fuente y lo mejor, es código Java!!!

Vale la pena también darle una mirada a CCAA y ver animaciones de otros algoritmos.

martes, febrero 21, 2006

Reunión para Entrega de Notas

Nos vemos hoy Martes 21 de Febrero en el salón de clase para hacerles entrega de sus notas.

Acabo de enviar un correo con el archivo de notas actualizado.

lunes, febrero 20, 2006

Por fin las Notas

Bueno, finalmente terminé de calificar los dos talleres que faltaban y acabo de enviar un e-mail con las tan anheladas notas.

Estaré pendiente de sus comentarios. Estén pendientes de la hora en que nos encontraremos mañana martes para dejar listo el asunto de las notas.

Suerte...

miércoles, febrero 15, 2006

Mejor Caso, Peor Caso y Caso Promedio

El análisis de un algoritmo no necesariamente implica encontrar el tiempo exacto o el orden del tiempo del algoritmo para cualquier entrada. Usualmente basta con analizar casos extremos: el mejor y el peor. El mejor caso, es aquel en el que el algoritmo utiliza la menor cantidad de recursos (tiempo, por ejemplo) para solucionar el problema; mientras que el peor caso es aquel en el que el algoritmo utiliza la mayor cantidad de recursos para encontrar la solución.

Nótese que aunque se diga "el mejor caso", no significa que haya una, y sólo una, entrada para la cual el algoritmo se ejecuta en el menor tiempo posible. Un argumento similar se tiene para "el peor caso".

Por ejemplo para Insertion-Sort el mejor caso ocurre cuando el arreglo de entrada está ordenado ya que no debe desplazar ningún elemento, en este caso el tiempo del algoritmo es de orden lineal; el peor caso ocurre cuando el arreglo de entrada está en orden inverso porque en cada iteración debe desplazar todos los elementos que están antes del elemento a insertar, en este caso, el tiempo del algoritmo es de orden cuadrático.

Para el análisis del caso promedio, se impone (si no se conoce) una distribución de probabilidad sobre las entradas del algoritmo, usualmente tal distribución corresponde a una uiforme, es decir, se asume que todas las entradas tienen la misma probabilidad de ocurrir, cuando se aplica dicho enfoque al análisis de Insertion-Sort se encuentra que el tiempo promedio tiene el mismo orden que el peor caso.

A partir de esta pequeña explicación, se deja como tarea responder las siguientes dos preguntas:

  1. ¿Por qué se prefiere, en general, el tiempo de peor caso de un algoritmo en vez del caso promedio?
  2. ¿Qué entradas representan el mejor y el peor caso de Merge-Sort?

jueves, diciembre 01, 2005

Entrega de Talleres

Sé que puede haber preocupaciones acerca de la fecha de entrega de los talleres que aún están pendientes.

Vamos a seguir el calendario de la Universidad, así que en Enero fijaremos la fecha definitiva de entrega, que supongo será algún día de la semana del 23 al 27 de Enero. Sin embargo, si alguien quiere entregar antes, puede hacerlo.

Pueden seguir haciendo y respondiendo preguntas en este blog o por e-mail. También pueden optar por enviarme versiones de los trabajos para que yo les haga correcciones, pero todo esto es opcional, es decir, no habrá premios para los que entreguen antes ni castigos para los que entreguen en la fecha que fije en Enero.

Es posible que recomiende algunos sitios y/o lecuras relacionados con el curso, igualmente opcional, aunque estaré pendiente de las preguntas y/o comentarios que hagan al respecto...

Así que si pueden, descansen...

viernes, noviembre 18, 2005

Bubble Sort

Tal vez lo primero que debe hacerse a la hora de hacer una prueba de correctitud es entender qué hace el algoritmo y cómo lo hace. En este caso creo que está claro el "qué" y para el "cómo" es suficiente con hacer un seguimiento con algún ejemplo. Si no han dado este "primer paso", les recomiendo que lo hagan antes de continuar.

Una vez tengan una idea de cómo opera el algoritmo, puede abordarse el problema en dos fases: suponer, primero, que las líneas 3 a 9 corresponden a otro procedimiento (o función) y hacer una prueba de correctitud para tal procedimiento. Una vez hecho eso, puede probarse la correctitud del procedimiento completo teniendo en cuenta que se conoce cuál es la operación del ciclo interno y además que es correcta, suponiendo que las líneas 3 a 9 se reemplazan por una llamada (en una línea) a otra función, por lo tanto sólo interesa saber qué hace esa línea.

Consideren, por ejemplo, el ciclo interno: la operación de las líneas 6 a 8 puede resumirse diciendo intercambiar(A[j], A[j+1]), aunque sería necesario probar la correctitud de intercambiar(a, b). Y en el momento de hacer la prueba del ciclo completo, se considerarían dos casos: en uno, los valores de las posiciones j y j+1 se intercambian y en el otro no, sin necesidad de recorrer de nuevo el procedimiento intercambiar.

Un inconveniente a la hora de hacer las pruebas es la escritura de las proposiciones en forma matemática. La idea es que NO vamos a ser, por el momento, demasiado rigurosos, en cambio, utilizaremos un lenguaje mixto. Por ejemplo: es válido decir que, en algún punto de la ejecución del algoritmo, los elementos de las posiciones 1 a k, o si prefieren, el subarreglo A[1..k] contiene sólo números primos...

Espero que se genere discusión al respecto...

lunes, noviembre 07, 2005

Taller de Recuperación

Pueden descargar el Taller de Recuperación utilizando el siguiente vínculo:

Taller [.pdf (81 KB)]

La fecha de entrega es el día Jueves 17 de Noviembre de 2005. No olviden que pueden hacer preguntas a través de este medio.

El niño y la escalera: punto a su favor...

Efectivamente había considerado una relación de recurrencia que no correspondía al problema planteado. Consideré dos alternativas:

i) T(n) = T(n - 1) + 1; para n > 1; T(1) = 1

ii) T(n) = T(n - 2) + 2; para n > 2; T(1) = 1, T(2) = 2

Daré un punto de bonificación para la primera persona que describa, por este medio y de manera correcta, el error en la definición de las relaciones planteadas en i) y en ii).

¡Bienvenidos!

Espero que utilicen este espacio para escribir preguntas, comentarios, ideas, recomendaciones, etc. acerca de la clase. La idea es que nutramos entre todos este blog, es decir, si alguien escribe alguna pregunta, cualquiera puede responderla y si se genera algún tipo de discusión muchísimo mejor.

Así que comencemos...