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 C.
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 clock() permite medir cada caso. Para búsqueda lineal:
#include <stdio.h>
#include <time.h>
int busqueda_lineal(const int *v, int n, int objetivo) {
for (int i = 0; i < n; i++) {
if (v[i] == objetivo) return i;
}
return -1;
}
double medir_busqueda(const int *v, int n, int objetivo) {
clock_t inicio = clock();
busqueda_lineal(v, n, objetivo);
clock_t fin = clock();
return (double)(fin - inicio) / CLOCKS_PER_SEC;
}
int main(void) {
int datos[100000];
for (int i = 0; i < 100000; i++) datos[i] = i;
printf("Peor caso: %.6f s\n", medir_busqueda(datos, 100000, -1));
printf("Mejor caso: %.6f s\n", medir_busqueda(datos, 100000, datos[0]));
return 0;
}
Repite mediciones y promedia para reducir ruido; fija afinidad de CPU o cierra procesos para obtener resultados consistentes.