Introducción
El análisis de la complejidad temporal de un algoritmo es una medida de la cantidad de tiempo que toma ejecutar un algoritmo en función del tamaño de la entrada. Este análisis es crucial para entender la eficiencia de un algoritmo y compararlo con otros.
Conceptos Clave
- Tiempo de Ejecución: La cantidad de tiempo que un algoritmo tarda en completarse.
- Tamaño de la Entrada (n): La cantidad de datos que el algoritmo debe procesar.
- Función de Complejidad Temporal: Una función que describe cómo el tiempo de ejecución de un algoritmo crece con el tamaño de la entrada.
Notación Asintótica
La notación asintótica se utiliza para describir la complejidad temporal de un algoritmo de manera abstracta y simplificada. Las tres notaciones más comunes son:
- O(n) - Notación Big O: Describe el peor caso.
- Ω(n) - Notación Omega: Describe el mejor caso.
- Θ(n) - Notación Theta: Describe el caso promedio.
Ejemplos de Notación Big O
- O(1): Tiempo constante.
- O(log n): Tiempo logarítmico.
- O(n): Tiempo lineal.
- O(n log n): Tiempo linealítmico.
- O(n^2): Tiempo cuadrático.
Análisis de Complejidad Temporal
Pasos para Analizar la Complejidad Temporal
- Identificar las operaciones básicas: Determinar las operaciones que más contribuyen al tiempo de ejecución.
- Contar las operaciones básicas: Contar cuántas veces se ejecutan las operaciones básicas en función del tamaño de la entrada.
- Expresar el tiempo de ejecución: Usar la notación asintótica para expresar el tiempo de ejecución.
Ejemplo Práctico
Consideremos el siguiente algoritmo de búsqueda lineal:
Análisis Paso a Paso
- Operación Básica: La comparación
arr[i] == x
. - Contar Operaciones: En el peor caso, la comparación se realiza
n
veces, donden
es el tamaño del arregloarr
. - Expresar el Tiempo de Ejecución: En el peor caso, el tiempo de ejecución es
O(n)
.
Comparación de Algoritmos
A continuación, se presenta una tabla comparativa de la complejidad temporal de algunos algoritmos comunes:
Algoritmo | Mejor Caso | Peor Caso | Promedio |
---|---|---|---|
Búsqueda Lineal | O(1) | O(n) | O(n) |
Búsqueda Binaria | O(1) | O(log n) | O(log n) |
Ordenamiento por Inserción | O(n) | O(n^2) | O(n^2) |
Ordenamiento por Mezcla | O(n log n) | O(n log n) | O(n log n) |
Ejercicios Prácticos
Ejercicio 1: Análisis de Complejidad Temporal
Analiza la complejidad temporal del siguiente algoritmo:
Solución
- Operación Básica: La operación
suma += i
. - Contar Operaciones: El bucle
for
se ejecutan
veces. La operaciónsuma += i
se ejecutan/2
veces en promedio. - Expresar el Tiempo de Ejecución: En el peor caso, el tiempo de ejecución es
O(n)
.
Ejercicio 2: Comparación de Algoritmos
Compara la complejidad temporal de los siguientes dos algoritmos para encontrar el máximo en un arreglo:
Algoritmo A:
def encontrar_maximo_a(arr): maximo = arr[0] for i in range(1, len(arr)): if arr[i] > maximo: maximo = arr[i] return maximo
Algoritmo B:
Solución
-
Algoritmo A:
- Operación Básica: La comparación
arr[i] > maximo
. - Contar Operaciones: El bucle
for
se ejecutan-1
veces. - Tiempo de Ejecución:
O(n)
.
- Operación Básica: La comparación
-
Algoritmo B:
- Operación Básica: La ordenación
arr.sort()
. - Contar Operaciones: La ordenación tiene una complejidad de
O(n log n)
. - Tiempo de Ejecución:
O(n log n)
.
- Operación Básica: La ordenación
Conclusión: El Algoritmo A es más eficiente que el Algoritmo B para encontrar el máximo en un arreglo.
Conclusión
En esta sección, hemos aprendido a analizar la complejidad temporal de los algoritmos, identificar las operaciones básicas, contar las operaciones y expresar el tiempo de ejecución utilizando la notación asintótica. Este conocimiento es fundamental para diseñar algoritmos eficientes y comparar diferentes enfoques para resolver un problema.
En el siguiente módulo, exploraremos la complejidad espacial y cómo afecta la eficiencia de los algoritmos.
Curso de Análisis y Diseño de Algoritmos
Módulo 1: Introducción a los Algoritmos
Módulo 2: Análisis de Algoritmos
- Análisis de Complejidad Temporal
- Análisis de Complejidad Espacial
- Casos de Complejidad: Mejor, Peor y Promedio
Módulo 3: Estrategias de Diseño de Algoritmos
Módulo 4: Algoritmos Clásicos
- Búsqueda Binaria
- Ordenamiento por Inserción
- Ordenamiento por Mezcla (Merge Sort)
- Ordenamiento Rápido (Quick Sort)
- Algoritmo de Dijkstra
- Algoritmo de Floyd-Warshall