Objetivo
Desarrollar intuición para mapear situaciones a , ,
Prerequisitos
Notación big O
Recorrido
Cotas
¿Cuáles de estas afirmaciones son verdaderas? Recordá: la consigna asume que se busca una cota ajustada, no la más grande posible.
Ver respuesta
Falso. significa tiempo constante. crece sin límite, no puede estar acotada por una constante. Para cota ajustada, .
Ver respuesta
Verdadero pero no es cota ajustada. es constante, así que . Decir es correcto matemáticamente ( para todo con ), pero no es ajustado.
Ver respuesta
Falso como cota ajustada. crece linealmente, no exponencialmente. La cota ajustada es , no . sería una cota correcta pero muy holgada.
Ver respuesta
Verdadero. El término dominante es . para y . Como el término dominante es exactamente , es además la cota ajustada.
Ver respuesta
Falso como cota ajustada. . La cota ajustada es , no . sería válida pero no ajustada.
Ver respuesta
Verdadero. . Entonces . Son proporcionales: ambos crecen igual de rápido. es la misma clase sin importar la base.
Enlace al originalVer respuesta
Falso. . Es decir, crece mucho más rápido que , no puede estar acotada por ella. .
La mesa más cercana
Imaginá que sos el dueño de un restaurante y tenés que encontrar la mesa libre más cercana a la entrada. Tenés tres estrategias:
- Estrategia A: revisás cada mesa una por una desde adelante.
- Estrategia B: dividís el salón a la mitad, descartás mitades hasta encontrarla.
- Estrategia C: cada mozo memorizó qué mesas están libres en su zona y te avisa al instante.
¿A qué complejidades corresponden A, B y C? Justificá brevemente.
Enlace al originalSaludos
Llegás a una reunión. La regla es que cada persona saluda a todas las demás exactamente una vez.
Con 2 personas: 1 saludo. Con 3 personas: 3 saludos. Con 4 personas: 6 saludos. Con 5 personas: 10 saludos.
¿Ves el patrón? Cada persona nueva tiene que saludar a todas las anteriores.
- Si hay n personas ¿cuántos saludos habrá en total?
- Si hay 100 personas en la reunión, ¿cuántos saludos hay?
Doblando un papel
Tomás una hoja y la doblás a la mitad. Ahora tiene el doble de grosor. La doblás de nuevo: cuatro veces el grosor original. Cada doblez duplica el grosor.
Empezás con 0,1 mm de grosor.
Después de 10 dobleces: ~100 mm (10 cm). Después de 20 dobleces: ~100 metros. Después de 30 dobleces: ~100 km. Después de 42 dobleces: llegarías a la Luna.
Esto es crecimiento exponencial: la función . Ahora pensalo al revés. Si el papel ya tiene 1024 capas y querés saber cuántos dobleces se hicieron, ¿cuánto trabajo te lleva calcularlo?
Enlace al originalAjedrez
Historia
El rey Iadava, obligado por la guerra, vence al invasor Varangul en una sangrienta batalla, pero el triunfo le cuesta la vida de su hijo, el príncipe Adjamir. Consumido por el dolor, el monarca cae en una obsesión enfermiza, reviviendo una y otra vez la batalla, incapaz de superar su pérdida pese a las oraciones de los brahmanes.
Un joven brahmán llamado Lahur Sessa se presenta ante el rey con un juego que ha inventado para aliviar su tristeza: el ajedrez. A través de sus reglas y simbolismos, Sessa le enseña que la fuerza de un rey depende de sus súbditos y que, en la guerra, el sacrificio de algunas piezas puede ser necesario para alcanzar la victoria. El juego ayuda a Iadava a comprender y aceptar lo ocurrido en la batalla.
Agradecido, el rey ofrece a Sessa cualquier recompensa, y este pide granos de trigo que se dupliquen en cada casilla del tablero. Aunque parece una petición humilde, el cálculo revela una cantidad imposible de pagar. Sessa renuncia entonces a su recompensa y deja una lección sobre la prudencia y los límites del poder. Impresionado por su sabiduría, el rey lo nombra su primer ministro.Tomado de: El hombre que calculaba, de Malba Tahan. Resumido sin piedad por la IA.
Enunciado
El brahmán Lahur Sessa pide como recompensa granos de trigo colocados sobre un tablero de ajedrez de 64 casillas, de la siguiente manera:
- En la primera casilla, 1 grano.
- En la segunda, 2 granos.
- En la tercera, 4 granos.
- Y así sucesivamente, duplicando la cantidad en cada casilla.
- ¿Cuántos granos hay en la casilla ?
- ¿Cuántos granos hay en total en el tablero?
- Expresá ambas respuestas usando notación matemática.
- ¿A qué orden de complejidad corresponde el crecimiento de la cantidad de granos?
Análisis de Fragmento de Código 1
Mirá este fragmento de código:
PARA i = 1 HASTA n HACER PARA j = i HASTA n HACER suma ← suma + 1 FIN PARA¿Cuál es la complejidad de este código? ¿Por qué?
Enlace al originalAnálisis de Fragmento de Código 2
Mirá este fragmento de código:
Leer(a) n ← a * a c ← 0 MIENTRAS (a > 1) HACER a ← a / 2 PARA i = 1 HASTA n HACER c ← c * 2 FIN PARA FIN MIENTRAS¿Cuál es la complejidad de este código? ¿Por qué?
Enlace al originalAnálisis de Fragmento de Código 3
Mirá este fragmento de código:
PARA i = 2 HASTA n HACER k ← i PARA k = i HASTA 2 (paso -1) HACER SI a(k-1) > a(k) ENTONCES Aux ← a(k-1) a(k-1) ← a(k) a(k) ← Aux FIN SI FIN PARA FIN PARA¿Cuál es la complejidad de este código? ¿Por qué?
Enlace al originalFactorial Recursivo e Iterativo
Ambas versiones de este algoritmo calculan , pero ¿tienen la misma complejidad?
Versión iterativa:
PARA i = 1 HASTA n HACER result ← result × i return resultVersión recursiva:
SI n = 0 return 1 SI NO return factorial(n-1) × nAmbas hacen exactamente multiplicaciones. Pero la versión recursiva tiene overhead de stack: cada llamada guarda el estado en memoria.
¿Cuál es la complejidad temporal y espacial de cada una?
Enlace al originalNociones de Complejidad
Si tenés 1 segundo para correr tu algoritmo y una PC1 que hace ops/seg, ¿cuántos elementos podés procesar con cada complejidad? ¿Y en una computadora PC2 que es 1000 veces más rápida que PC1?
Confeccionemos esta tabla:
Enlace al originalComplejidad Elementos (PC1) Elementos (PC2) Cálculo de Complejidad 1
Si se sabe que el algoritmo de selección tardó 10 segundos en ordenar 10000 elementos:
- ¿Cuántos elementos podría ordenar en el triple de tiempo?
- ¿Cuánto tardaría en ordenar el triple de elementos?
- ¿Cuánto tardaría en ordenar el triple de elementos en una máquina 3 veces más rápida?
Enlace al originalVer solución
Solución paso a paso
Este tipo de ejercicios requiere, casi siempre, de un análisis de la situación inicial. No siempre se tienen todos los datos, y es mejor tenerlos a mano antes de comenzar a responder las preguntas.
Marquemos la información disponible:
se sabe que el algoritmo de selección tardó 10 segundos en ordenar 10000 elementosEsa información nos permite llenar varias partes de la ecuación:
Sabemos que:
- es 10 segundos (dato)
- es (por complejidad de Selección)
- es (dato. Recomendamos notación científica)
Entonces podemos armar la ecuación en la situación original, y despejar :
Con este dato, la constante computacional de la computadora inicial, podemos empezar a responder las preguntas:
1. ¿Cuántos elementos podría ordenar en el triple de tiempo?
Esta situación requiere despejar la ecuación, con el nuevo
Sabemos que:
- es
- es (mismo algoritmo)
- es (misma computadora)
- es la incógnita
A priori podemos deducir que, si el mismo algoritmo se ejecuta por más tiempo, debe procesar una entrada mayor necesariamente. Por ello,
Despejemos:
Es notable que se debe redondear hacia abajo, ya que no se puede ordenar “una fracción de elemento”, y ya que no se pudo ordenar, sería inapropiado redondear hacia arriba.
La parte más importante es preguntarnos… ¿tiene sentido este resultado? En este caso, sí lo tiene: un algoritmo cuadrático, triplicando el tiempo, implica que el tamaño se multiplicó por raiz de tres.
2. ¿Cuánto tardaría en ordenar el triple de elementos?
En esta nueva situación, volvemos a referirnos al contexto original, y
Sabemos que:
- es (dato)
- es (mismo algoritmo)
- es (misma computadora)
- es la incógnita
A priori podemos deducir que, si el mismo algoritmo se ejecuta para más elementos, debe tardar más. Habiendo visto los resultados del punto anterior, parecería que debe tardar 9 veces más (3 al cuadrado). Entonces, seguramente
Resolvamos:
Volvemos a preguntarnos si tiene sentido el resultado. En este caso, pudimos predecir el valor simplemente realizando un análisis a priori de la situación: efectivamente .
3. ¿Cuánto tardaría en ordenar el triple de elementos en una máquina 3 veces más rápida?
Esta última situación nos plantea un cambio en el valor de . La pregunta será… ¿al ser más rápida, el valor debe ser más grande o más pequeño al original? Para no depender de nuestra memoria, analizamos la ecuación original:
Y deducimos: la está en el término de la derecha. Una computadora más rápida debería hacer que el baje, aún manteniendo inalteradas las otras variables. Es por ello que necesitaríamos que se achique el valor de . En conclusión: una computadora más rápida implica un más pequeño.
Adicionalmente, podemos pensar que el tiempo debe ser menor que el del punto anterior, que tiene la situación similar a la actual.
Dicho esto, sabemos que:
- es (triple de elementos)
- es (mismo algoritmo)
- es (computadora “tres veces más rápida”)
- es la incógnita
Resolvamos:
Preguntémonos por última vez si tiene sentido el resultado. En este caso, si la computadora es tres veces más rápida, deberíamos confirmar que , y efectivamente es el resultado obtenido.
Cálculo de Complejidad 2
Suponga que debe ordenar un vector por el método de Selección. Su entrada es de 2000 elementos y en su PC obtuvo un tiempo de 10 segundos.
- Si debiera ordenar un vector de 5000 entradas, ¿cuál sería el tiempo estimado de ejecución?
- ¿Cuál sería el tamaño máximo de vector que podría ordenar en 40 segundos?
- Resuelva este problema reemplazando el método de ordenamiento por cada uno de los métodos vistos.
Cálculo de Complejidad 3
El algoritmo de selección ordenó un vector de 10000 enteros en 5 seg.
- ¿Cuál será el tamaño del vector que espera ordenar en 20 seg.? Justifique.
- ¿Qué sucede si ordena ambos vectores en una máquina 5 veces más rápida?
Cálculo de Complejidad 4
Utilizando el algoritmo de inserción se ordenó en un tiempo , elementos. En un tiempo de se ordenó un vector de elementos.
Explique las condiciones bajo las cuales pudieron hacerse las pruebas.
Enlace al originalCálculo de Complejidad 5
Utilizando el algoritmo de QuickSort se ordenó un vector de 1 millón de elementos en un tiempo . ¿Cuántos elementos espera ordenar en un tiempo ?
Enlace al originalEl detective algorítmico
Un programador midió su algoritmo con distintas entradas:
n = 100 → 0.01 seg n = 200 → 0.04 seg n = 400 → 0.16 seg n = 800 → 0.64 segCada vez que duplica n, el tiempo se multiplica por 4.
- ¿Qué complejidad tiene este algoritmo?
- ¿Podés deducirlo solo con los datos? Justificá tu respuesta.