Categorizar algoritmos
En esta página, compararás cuatro algoritmos y aprenderás cómo cada uno de ellos toma una categoría diferente de tiempo para ejecutarse.
-
Localiza el bloque
incluido en tu proyecto, y registra el tiempo que demora para varios números iniciales.
Número inicial |
Tiempo de 25,000 números enteros
|
1000 |
|
10,000 |
|
100,000 |
|
1,000,000 |
|
10,000,000 |
|
Mira la tabla. ¿Cómo describirías lo que sucede con el tiempo a medida que el número inicial se hace más grande? Escribe una hipótesis sobre este patrón.
-
Hay varias maneras diferentes de ordenar una lista, algunas de las cuales aprenderás en la Unidad 8. El bloque categoría
utiliza un algoritmo de "categoría de inserción".
Localiza el bloque
incluido en tu proyecto, y prográmalo para cada longitud de lista.
Longitud de la lista |
Tiempo de la categoría |
10 |
|
100 |
|
1000 |
|
¿Cómo describirías lo que sucede con el tiempo a medida que el tamaño de la lista de entrada se hace más grande? Escribe una hipótesis.
Puedes clasificar los algoritmos por la cantidad de tiempo que tardan en ejecutarse.
:
Tiempo lineal,
tiempo sublineal,
tiempo constante y
tiempo cuadrático
- Un algoritmo toma tiempo lineal (linear time) el número de pasos es proporcional al tamaño de la entrada; doblando el tamaño de la entrada se dobla el tiempo requerido.
- Un algoritmo toma tiempo sublineal (sublinear time) si el tiempo aumenta más lentamente que el tamaño.
- Un algoritmo toma tiempo constante (constant time) si toma la misma cantidad de tiempo sin importar el tamaño de la entrada.
- Un algoritmo toma tiempo cuadrático (quadratic time) si el número de pasos es proporcional al cuadrado del tamaño de la entrada.
- Vuelve a mirar tu tabla para la
búsqueda lineal
. Confirma que al multiplicar la longitud de la lista por diez, se multiplica aproximadamente el tiempo empleado por diez (tiempo lineal).
- Vuelve a mirar tu tabla para la
búsqueda binaria
. Confirma que el tiempo de búsqueda para cada lista de palabras es menor que para la búsqueda lineal (tiempo sublineal).
- Vuelve a ver tu tabla para los
25,000 números enteros
. Confirma que toma aproximadamente la misma cantidad de tiempo independientemente de la entrada (tiempo constante).
- Vuelve a ver tu tabla para
ordenar
. Confirma que al multiplicar la longitud de la lista por diez, se multiplica aproximadamente el tiempo por cien. (tiempo cuadrático).
La diferencia entre la búsqueda lineal y la búsqueda binaria puede ser muy importante si se busca en una lista de diez millones de elementos, pero la diferencia más importante en el algoritmo de eficiencia está entre el tiempo polinómico (proporcional a cualquier potencia del tamaño de la entrada) y el tiempo exponencial.
:
Tiempo polinómico y
tiempo exponencial
-
Un algoritmo toma tiempo polinómico si el número de pasos es menor o igual a una potencia del tamaño de la entrada, como la constante (n0), sublineal, lineal (n1), cuadrático (n2), o cúbico (n3).
-
Un algoritmo toma tiempo exponencial si el número de pasos es menor o igual a una función como 2n, 10n, etc., que es mucho más lento que cualquier polinomio.
En un algoritmo de tiempo exponencial, solo añadiendo 1 al tamaño de la entrada (n) of a 2n el algoritmo de tiempo ¡duplica el número de pasos! Así que, por ejemplo, si el tamaño de la entrada es 20, cualquier algoritmo de tiempo polinómico será lo suficientemente rápido, pero un algoritmo de tiempo exponencial puede tomar muchos años en finalizar.

AAP-4.A.7
- El término "tiempo razonable" describe cualquier algoritmo que se ejecuta en tiempo polinómico. Los algoritmos de tiempo exponencial no son considerados razonables.
AAP-2.M.2 text before bullets
Una razón por la que vale la pena aprender estas categorías es para evitar reinventar la rueda. Por ejemplo, has aprendido que si una lista está ordenada, puedes buscarla en tiempo sublineal utilizando la búsqueda binaria. Por lo tanto, cuando escribas un programa que necesite buscar en una lista repetidamente, vale la pena ordenar la lista antes de buscar. Conocer los algoritmos que ya existen puede ayudarte a construir nuevos algoritmos.
Todos los algoritmos que has explorado hasta ahora en este laboratorio (búsqueda lineal
; búsqueda binaria
; 25,000 números enteros
; y ordenar
) son algoritmos de tiempo razonable. La siguiente actividad opcional es un ejemplo de un algoritmo de tiempo exponencial.
Un problema que puede ser familiar y que requiere un algoritmo de tiempo exponencial es el de calcular cualquier elemento dado del Triángulo de Pascal. En el triángulo de Pascal, cada número se encuentra sumando los dos números de arriba. Por ejemplo, 4 + 6 = 10 y 15 + 6 = 21 como se muestra abajo. El primer y último número de cada fila, que no tienen dos números encima de ellos son 1.
-
Localiza el bloque
incluido en tu proyecto, y prográmalo para varias entradas.
Si tardan demasiado en ejecutarse, puedes detener el programa; solo tienes que rellenar la tabla hasta donde te permita la velocidad de tu computadora.
Entradas |
Triángulo de tiemo de Pascal |
5, 2 |
|
10, 5 |
|
15, 7 |
|
20, 10 |
|
25, 12 |
|
El valor de la fila es la entrada del triángulo de Pascal
que interesa. (La entrada de posición solo se da para obtener un tiempo para una de las posiciones cercanas al centro de la fila, que tardan más en calcularse.)
Estas entradas de fila son muy pequeñas comparadas con el tamaño de la entrada de los algoritmos de búsqueda lineal
, búsqueda binaria
, y ordenar
, y aún así el tiempo requerido para el triángulo de Pascal
es mucho mayor. Tu computadora probablemente no puede hacer mucho más allá de los 25.
Este algoritmo funciona sumando los dos números de arriba usando el algoritmo dentro de sí mismo recursivamente, pero hay mejores algoritmos que calculan el valor de un número en el triángulo de Pascal en tiempo lineal.
AAP-4.A part a
- Escribe un párrafo que explique la diferencia entre los algoritmos que se ejecutan en un tiempo razonable y los que no lo hacen.
-
Esta pregunta es similar a las que verás en el examen de AP CSP.
La siguiente tabla muestra el tiempo que tarda la computadora en realizar varias tareas sobre los datos de ciudades de diferentes tamaños.
Tarea |
Ciudad pequeña (población 1,000) |
Ciudad mediana (población 10,000) |
Ciudad grande (población 100,000) |
Entrada de datos |
2 horas |
20 horas |
200 horas |
Copia de seguridad de los datos |
0.5 hora |
5 horas |
50 horas |
Búsqueda a través de los datos |
5 horas |
15 horas |
25 horas |
Clasificación de datos |
0.01 hora |
1 hora |
100 hora |
Basado en la información de la tabla, cuál de las siguientes tareas es probable que tome
la mayor cantidad de tiempo cuando se amplía para una ciudad con una población de 1,000,000.
Entrar datos
Al multiplicar el tamaño de la población por 10, el tiempo necesario para introducir los datos también se multiplica por 10, de modo que para una población de 1.000.000, debería tomar alrededor de 10×200=2000 horas.
Realizar una copia de seguridad de los datos
Al multiplicar el tamaño de la población por 10, el tiempo necesario para hacer copias de seguridad de los datos se multiplica por 10, por lo que para una población de 1.000.000, debería tardar unas 10×50=500 horas.
Buscar entre los datos
La búsqueda de datos parece aumentar en unas 10 horas cada vez que la población se multiplica por 10, por lo que para una población de 1.000.000, debería llevar unas 35 horas..
Clasificar datos
¡Correcto! Al multiplicar el tamaño de la población por 10, el tiempo necesario para la clasificación de los datos se multiplica por 100. Por lo tanto, para una población de 1.000.000, debería tomar alrededor de 100×100=10.000 horas.