¿Por qué la notación Big-O es una forma muy útil de analizar la complejidad del algoritmo?

Si eres un ingeniero de software, probablemente no sea tan útil, una vez que vayas más allá de lo básico. Las consideraciones prácticas finalmente importan más que el análisis big-O. Eso no quiere decir que big-O no importe: un algoritmo de tiempo lineal generalmente superará a un algoritmo de tiempo cuadrático en casos del tamaño del mundo real. Le ayuda a clasificar los algoritmos en “eficiente” frente a “ineficiente”. Pero hay una gran diferencia entre 1000n yn que importa en términos prácticos. Big-O es “regla de oro”, no “muy útil”.

¿Por qué se usa la clasificación rápida cuando es O (n ^ 2), en comparación con la O del montón (n log n)? Porque generalmente es más rápido, en un múltiplo de 2–3, en comparación con una implementación de montón construida con la misma tecnología.

¿Por qué usar Timsort en lugar de un montón genérico? Porque los datos del mundo real, que a menudo ya están ordenados parcialmente, funcionan mejor en Timsort. No es un análisis que el análisis big-O te dará.

¿Estás operando en una máquina Turing? Probablemente no, probablemente esté ejecutando en una máquina de acceso aleatorio con una jerarquía de memoria (caché L1, caché L2, memoria principal, almacenamiento de respaldo). Y el comportamiento de la jerarquía de memoria es muy importante en el rendimiento práctico.

Si usted es un científico de la computación teórico, big-O (y sus primos) le brindan una manera de hablar sobre el desempeño del algoritmo de manera matemática, lo que resume los detalles de una máquina en particular. Nuevamente, para casos simples, generalmente es cierto que mejores límites en teoría también se traducen en mejores límites en la práctica. Y si va a comparar dos algoritmos, el comportamiento asintótico es sin duda uno de los puntos de referencia más obvios y útiles. Pero a menudo los mejores límites teóricos vienen con una implementación que es más lenta en todos los tamaños excepto en los “galácticos”. ¡Muchos algoritmos nuevos nunca se implementan en absoluto! El análisis asintótico permite la discusión de algoritmos como objetos matemáticos en lugar de artefactos prácticos. (Algunos investigadores prefieren los recuentos exactos de las operaciones, si se pueden lograr, en lugar de solo el límite asintótico, por ejemplo, “2n ^ 2 + 3n multiplicaciones” en lugar de solo “O (n ^ 2) multiplicaciones”).

Ver ¿Qué es un algoritmo galáctico?

Se utiliza principalmente como una forma de medir cuánto tiempo llevará ejecutar algo sin tener que ejecutarlo en hardware.

Hacemos algo porque queremos abstraer el hardware particular y aún así poder medir y tener una idea de cuánto tiempo tomarán las cosas.

Dado que las diferentes computadoras tienen diferentes velocidades de reloj, IPC (Instrucciones por ciclo) y otros factores que están vinculados a una ISA (arquitectura de conjunto de instrucciones) en particular que puede afectar el tiempo de ejecución de un fragmento de código.

La razón principal es que le permite abstraer cualquier detalle del hardware en el que se está ejecutando y / o cualquier otra desaceleración potencial que no tenga nada que ver con el algoritmo en sí. En general, no necesitamos considerar máquinas que tengan pausas para cosas como E / S (que se puede suponer que son instantáneas para la mayoría de los algoritmos).

Una vez que lo resumimos en un solo “número” (es decir, la gran O), podemos comparar manzanas / manzanas y no manzanas / naranjas de dos algoritmos, incluso si no se ejecutan en la misma máquina. Por ejemplo, puedo decir que para una lista ordenada, una búsqueda binaria es * SIEMPRE * más rápida que lineal (O (n) frente a O (log n)).

La razón por la cual la O grande es la medida preferida es porque es un tipo de límite superior, por lo que si encuentra la O grande mínima para un algoritmo, ha encontrado un límite superior mínimo. Básicamente, desea encontrar la clase de función de crecimiento más lento que superará el algoritmo, bajo multiplicación por una constante. Esto se utiliza para comprender el peor de los casos, que a menudo es lo que debemos tener en cuenta en casos prácticos.

La notación Big O se abstrae de las potencias del hardware en el que se está probando el algoritmo, por ejemplo, la eficiencia de un algoritmo todavía se puede determinar de la misma manera si el mismo algoritmo se prueba en una supercomputadora en la NSA o se prueba en este portátil estoy usando para escribir esto.