Ejercicios Prácticos de Complejidad Algorítmica I
Esta sección práctica consolida el análisis de complejidad asintótica mediante el análisis paso a paso de bucles simples, anidados y reducciones logarítmicas en múltiples lenguajes de programación.
1. Guía Rápida para el Análisis de Complejidad Temporal #
Para determinar la notación Big-O de cualquier bloque de código:
- Bucles Simples (): Si un bucle recorre de a con un incremento constante (), el coste es lineal.
- Bucles Anidados (, ): Si un bucle interno depende de las iteraciones del bucle externo, se multiplican sus órdenes de magnitud.
- Divisiones o Multiplicaciones del Índice (): Si la variable de control se multiplica () o divide () en cada paso, el número de iteraciones es logarítmico.
- Constantes (): Operaciones aritméticas directas y acceso por índice a arrays.
2. Ejercicios Resueltos de Ejemplo #
1# Caso 1: Bucle con salto logarítmico -> O(log n) 2def ejemplo_logaritmico(n): 3 i = 1 4 while i < n: 5 print(i) 6 i *= 2 7 8 # Caso 2: Bucles dependientes -> O(n^2) 9def ejemplo_triangular(n): 10 for i in range(n): 11 for j in range(i, n): 12 print(i, j)
Resumen del tema
Conceptos clave #
- Identificación de Patrones Big-O:
- Bucles lineales con paso constante .
- Bucles anidados de tamaño .
- Bucles con salto multiplicativo o división binaria .
- Uso de Tablas Hash: sustitución de búsquedas anidadas por accesos clave-valor .
Qué debes recordar #
Determina la complejidad identificando la tasa de crecimiento de las iteraciones respecto al tamaño de la entrada .