Un mismo algoritmo puede tener costos distintos según la distribución de datos. Aquí diferenciamos mejor, promedio y peor caso, y mostramos cómo medirlos en Python.
Big-O suele referirse al peor caso, pero otros escenarios importan:
Elegir cuál reportar depende del riesgo aceptable y del tipo de datos con el que trabajará el algoritmo.
Búsqueda lineal (array desordenado):
O(1) si el elemento está en la primera posición.O(n) porque en promedio se revisa la mitad, pero Big-O no simplifica más.O(n) si no se encuentra o está al final.Búsqueda binaria (array ordenado):
O(1) si justo está en el medio.O(log n) por dividir en cada paso.Inserción en listas enlazadas:
O(1) en todos los casos.O(1) si está vacía, peor O(n) si hay que recorrer.Búsqueda en BST:
O(log n).O(n).Graficar curvas (por ejemplo con CSV y una hoja de cálculo) ayuda a visualizar cómo se separan los escenarios: una línea O(n) crece más lento que O(n^2) y se nota al duplicar n. Para casos mejor/promedio/peor, se suelen mostrar tres curvas o bandas.
Un esquema simple usando time.perf_counter() permite medir cada caso. Para búsqueda lineal:
import time
def busqueda_lineal(valores, objetivo):
for i, valor in enumerate(valores):
if valor == objetivo:
return i
return -1
def medir_busqueda(valores, objetivo):
inicio = time.perf_counter()
busqueda_lineal(valores, objetivo)
fin = time.perf_counter()
return fin - inicio
datos = list(range(100000))
print("Peor caso: %.6f s" % medir_busqueda(datos, -1))
print("Mejor caso: %.6f s" % medir_busqueda(datos, datos[0]))
Repite mediciones y promedia para reducir ruido; fija afinidad de CPU o cierra procesos para obtener resultados consistentes.