Un algoritmo es una secuencia finita de pasos bien definidos para resolver un problema. Una receta de cocina es un algoritmo, y también lo es el procedimiento para ordenar una lista de nombres. En informática, escoger un buen algoritmo puede marcar la diferencia entre un programa fluido y uno inutilizable.
Imagina que debes encontrar un nombre en una guía telefónica de un millón de entradas. Podrías revisarla desde la primera página hasta encontrarlo, lo que en el peor caso exigiría un millón de comparaciones. O podrías abrirla por la mitad, decidir si el nombre está antes o después y repetir el proceso. Con este método, llamado búsqueda binaria, bastan unas veinte comparaciones.
Medir el tiempo de ejecución en segundos depende de la computadora, del lenguaje y de otros factores. Por eso se analiza cómo crece el trabajo del algoritmo al aumentar el tamaño de los datos. Esta idea se expresa con la notación O grande, que describe el comportamiento en el peor caso ignorando constantes y detalles menores.
Un algoritmo de tiempo constante tarda lo mismo sin importar el tamaño de los datos. Uno lineal tarda proporcionalmente más cuando los datos crecen. Los logarítmicos, como la búsqueda binaria, crecen muy lentamente. Los cuadráticos, comunes en métodos de ordenamiento simples, se vuelven lentos con grandes volúmenes. Y los exponenciales se vuelven inviables incluso para tamaños moderados.
El ordenamiento es un problema clásico. Los métodos simples, como el de burbuja, comparan pares repetidamente y son cuadráticos. Algoritmos más ingeniosos, como el ordenamiento por mezcla o el rápido, dividen el problema en partes más pequeñas y alcanzan un tiempo proporcional a n por logaritmo de n, enormemente más rápido con millones de elementos.
La eficiencia también depende de cómo se organizan los datos. Una tabla hash permite buscar elementos en tiempo casi constante. Un árbol equilibrado mantiene los datos ordenados y permite búsquedas rápidas. Elegir la estructura adecuada es tan importante como elegir el algoritmo.
Existen problemas para los que no se conocen algoritmos eficientes, como encontrar la ruta más corta que visita muchas ciudades exactamente una vez. La pregunta de si todos los problemas cuya solución se verifica rápido también se pueden resolver rápido, conocida como P contra NP, es uno de los grandes problemas abiertos de las matemáticas.
Las empresas de internet procesan cantidades gigantescas de datos, y un algoritmo ineficiente puede costar millones en servidores. Para un programador, saber analizar la complejidad evita escribir código que funciona con diez datos de prueba pero colapsa con un millón de usuarios reales.
Supón que tienes un millón de elementos. Un algoritmo cuadrático haría del orden de un billón de operaciones, lo que en una computadora común podría tardar horas. Uno de tipo n por logaritmo de n haría unos veinte millones, cuestión de décimas de segundo. La diferencia no es de un poco más rápido, sino de órdenes de magnitud. Por eso, cuando un programa se vuelve lento al crecer los datos, la solución casi nunca es comprar una computadora más potente, sino reemplazar el algoritmo por uno más eficiente.
Los algoritmos son el corazón de la informática. Aprender a pensarlos y evaluarlos transforma la manera de resolver problemas, dentro y fuera de la computadora.