Archivo categoría Ayudantía

No le crujió

Cosas que uno encuentra corrigiendo pruebas.

"No me crujió". Elefante en prueba.

"No me crujió". Elefante en prueba.

8 Comentarios

Tiempo exponencial y el problema del millón

Aviso: este artículo es una pequeña motivación al tema de la “eficiencia” de los algoritmos. Requiere ciertos conocimientos técnicos. Lo dejo en el blog para mantener registro de él (lo tenía escrito en un papel que encontré). ¡Comentarios bienvenidos!

Matías es un alumno de Introducción a la Programación. Para su primera tarea tiene que desarrollar un programa que escriba un número 1 en la consola. Con dos semanas de plazo para entregar, Matías —un alumno brillante— se relaja y decide aventurarse por una estrategia original. Probará todas las posibles secuencias de caracteres de largo 1, luego de largo 2, y así sucesivamente, hasta que una de ellas haga lo que pide el enunciado. De esta manera, él entregará el programa más corto posible que resuelve el problema (lo cual es motivo de orgullo).

Para conseguirlo cuenta con P computadores, cada uno con la capacidad de verificar O posibles programas por segundo (no me pregunten de dónde los sacó, sólo sabemos que los tiene). Llamemos t(n) al tiempo que tardarán todos estos computadores en verificar todos los programas de largo n (es decir, que tienen n caracteres en total). Suponiendo que Matías puede usar 256 caracteres para programar, tiene en total 256^n posibles programas de largo n. Así, el tiempo que tardará en verificarlos está dado por

t(n)=(256^n)/(P*O)

Supongamos ahora que en cada electrón del universo tenemos un supercomputador que realiza 10^50 de estas verificaciones por segundo. La cantidad estimada de electrones del universo es 10^130, por lo que

t(n)>=(256^n)/(10^50*10^130)

Ahora bien, el siguiente programa en Java escribe el número 1 en la consola. Tiene 96 caracteres.

public class Principal
{
  public static void main(String[] args) {
    System.out.println(1);
  }
}

Si eliminamos los saltos de línea innecesarios lo podemos dejar en 86 caracteres. Asumamos que éste es el programa de menor largo que es solución al enunciado.

public class Principal{public static void main(String[] args){System.out.println(1);}}

Para llegar a verificar los programas de largo 86, Matías debe verificar primero todos los de largo 85 (y darse cuenta de que ninguno le servía). En total hay 256^85 programas que verificar (es decir, exponencial respecto del largo del programa). Así, para n=85 tenemos que

Como 2^10=1024>1000=10^3, entonces

La edad estimada del universo es de 13.600 millones de años, y eso es 10^18. Esto significa que para verificar todos los programas de largo 85, Matías tardará t(85)>10^24>10^18 segundos, ¡más que la edad del universo!

¿Se van imaginando cuánto tiempo tardaría —con todo ese poder computacional— si el programa más corto que le sirve tuviera unas 200 líneas de código (que es algo más razonable que 85)?

Este simple ejemplo justifica un poco la elección del apodo “ineficiente” para los algoritmos de tiempo exponencial. Se sabe que los problemas de la clase NP pueden ser resueltos de manera determinista en tiempo a lo más exponencial (como el problema de Matías). Lo que no se sabe es si cada uno de ellos además se puede resolver en tiempo polinomial de manera determinista (P).

El problema de P y NP es uno de los más importantes en computación teórica, y ciertamente el más importante en el área de Complejidad Computacional. Tan importante es (y tan difícil), que es uno de los siete problemas por cuya solución el Instituto de Matemáticas Clay ofrece un millón de dólares.

Habrá que ponerse a estudiar.

No hay Comentarios

Simulación

Como estoy bastante enfermo, estos dos días he estado condenado a la soledad de la casa, los pies helados y la gata pidiéndome comida cada cierto rato. Al menos después de comer viene a acostarse a mis piernas.

La única cosa productiva que he hecho ha sido preparar en Java una simulación de una temporada completa de torneos de tenis para mis alumnos de ayudantía.

¿Y a qué viene esto, dirá el lector desprevenido? A que el trabajo ha sido duro, y estoy tan contento con el resultado que quiero compartirlo con ustedes. Si tienes Java (y preferentemente, Eclipse), puedes descargar directamente el proyecto comprimido. Si no, a continuación copio la salida de una de las ejecuciones de la simulación, pero podría arruinarle la sorpresa a los que prefieren ver el código primero. Leer el resto de la entrada »

3 Comentarios

Cansancio

Estoy tremendamente cansado, he estado trabajando desde las 07:50 de la mañana (son las 20:35), parando a almorzar y para ir a una clase.

Por otra parte estoy contento, les preparé una guía de recursión a los niños de la ayudantía, y quedó entretenida.

2 Comentarios

Lápiz rojo

Llego a la U, donde tengo 120 pruebas esperando ser corregidas, y no tengo un puto lápiz rojo para rayarlas.

4 Comentarios