Si hay un algoritmo que se ejecuta en el tiempo para algún problema A, y a alguien se le ocurre un algoritmo que se ejecuta en el tiempo, , donde , ¿se considera una mejora con respecto al algoritmo anterior?O ( f ( n ) / g ( n ) ) g ( n ) = o ( f ( n ) )
¿Tiene sentido, en el contexto de la informática teórica, proponer un algoritmo de este tipo?
algorithms
amor
fuente
fuente
Respuestas:
No, un algoritmo que se ejecuta en el tiempo , donde , no se considera necesariamente una mejora. Por ejemplo, supongamos que y . Entonces es un límite de tiempo peor que .g ( n ) = o ( f ( n ) ) f ( n ) = n g ( n ) = 1 / n O ( f ( n ) / g ( n ) ) = O ( n 2 ) O ( f ( nO ( f( n ) / g( n ) ) sol( n ) = o ( f( n ) ) F( n ) = n sol( n ) = 1 / n O ( f( n ) / g( n ) ) = O ( n2) O ( f( n ) ) = O ( n )
Para mejorar un algoritmo que se ejecuta en el tiempo , debe crear un algoritmo que se ejecute en el tiempo , es decir, en el tiempo para alguna función .o ( f ( n ) ) g ( n ) g ( n ) = o ( f ( n ) )F( n ) o ( f( n ) ) sol( n ) sol( n ) = o ( f( n ) )
Si todo lo que sabe es que un algoritmo se ejecuta en el tiempo , entonces no está claro si un algoritmo que se ejecuta en el tiempo es una mejora, cualquiera que sea son. Esto se debe a que O grande es solo un límite superior en el tiempo de ejecución. En lugar de ello, es común considerar el tiempo en el peor caso, y estimar como un gran en lugar de sólo como un gran .O ( g ( n ) ) f ( n ) , g ( n ) Θ OO ( f( n ) ) O ( g( n ) ) F( n ) , g( n ) Θ O
fuente
Recuerde que Notación es para el análisis de cómo la tarea crece para diferentes tamaños de entrada y, específicamente, deja fuera factores multiplicativos, de orden inferior término, y constantes.O ( . . . )
Suponga que tiene un algoritmo cuyo tiempo de ejecución real es 1 n 2 + 2 n + 1 (suponiendo que realmente pueda contar las instrucciones y conocer los tiempos exactos, etc., lo cual es una suposición enorme en los sistemas modernos). Luego, suponga que se le ocurre un nuevo algoritmo que resulta ser O ( n ) , pero el tiempo de ejecución real es 1000 n + 5000 . Suponga también que sabe que el software para usar este algoritmo nunca verá un tamaño de problema de n > 10 .O ( n2) 1 n2+2n+1 O(n) 1000n+5000 n>10
Entonces, ¿cuál elegirías: el algoritmo que tomará 15000 unidades de tiempo, o el algoritmo O ( n 2 ) que solo tomará 121 unidades? Ahora, si su software evoluciona para manejar tamaños de problemas de n > 100000 , ¿cuál elegiría? ¿Qué harías si el tamaño de tu problema varía mucho?O(n) O(n2) n > 100000
fuente
En general, lo que eso significa es que, para cualquier tamaño de entrada que sea lo suficientemente grande, el peor tiempo de ejecución del algoritmo anterior es más lento que el nuevo. Eso es equivalente al formalismo , donde g es la complejidad temporal del nuevo algoritmo yf la complejidad temporal del antiguo.sol( n ) ∈ o ( f( n ) ) sol F
Sin embargo, a veces los informáticos se preocupan por el rendimiento promedio de los casos. El ejemplo clásico es la ordenación rápida: el peor de los casos el tiempo de ejecución es mientras que sabemos que otros que se ejecutan en Θ ( n log n ) tiempo, pero es ampliamente utilizado en la práctica debido a su buen tiempo de funcionamiento en el caso promedio. Además, se puede ajustar para que se ejecute muy rápidamente en los casos que son más frecuentes en la naturaleza, como las matrices que se encuentran principalmente en el orden correcto.Θ ( n2) Θ ( n logn )
Y a veces, incluso los informáticos teóricos usan "más rápido" de la misma manera que las personas normales. Por ejemplo, la mayoría de las implementaciones de las clases de cadenas tienen la optimización de cadenas cortas (también llamada optimización de cadenas pequeñas), aunque solo acelera las cosas para cadenas cortas y es pura sobrecarga para las más largas. A medida que el tamaño de entrada aumenta y aumenta, el tiempo de ejecución de una operación String con SSO será mayor en un término constante pequeño, por lo que según la definición que di en el primer párrafo, eliminar SSO de una clase String lo hace "más rápido ”. Sin embargo, en la práctica, la mayoría de las cadenas son pequeñas, por lo que SSO hace que la mayoría de los programas que las usan sean más rápidos, y la mayoría de los profesores de informática saben mejor que andar por ahí exigiendo que las personas solo hablen sobre órdenes de complejidad asintótica del tiempo.
fuente
No existe una definición unificada de lo que es un "algoritmo más rápido". No existe un órgano rector que decida si un algoritmo es más rápido que otro.
Para señalar por qué esto es así, me gustaría ofrecer dos escenarios diferentes que demuestren este concepto turbio.
El primer ejemplo es un algoritmo que busca en una lista vinculada de datos no ordenados. Si puedo hacer la misma operación con una matriz, no tengo ningún cambio en la gran medida de rendimiento de Oh. Ambas búsquedas son O (n). Si solo miro los grandes valores de Oh, podría decir que no hice ninguna mejora en absoluto. Sin embargo, se sabe que las búsquedas de matrices son más rápidas que recorrer una lista vinculada en la mayoría de los casos, por lo que uno puede decidir que eso hizo que un algoritmo sea "más rápido", a pesar de que el gran Oh no cambió.
Si puedo usar el ejemplo tradicional de programar un robot para hacer un sándwich PBJ, puedo mostrar lo que quiero decir de otra manera. Considere solo el punto donde uno está abriendo el frasco de mantequilla de maní.
Versus
Incluso en el entorno teórico más académico que se me ocurre, encontrará que las personas aceptan que el primer algoritmo es más rápido que el segundo, a pesar de que los grandes resultados de la notación Oh son los mismos.
Por el contrario, podemos considerar un algoritmo para romper el cifrado RSA. Por el momento, se percibe que este proceso es probablemente O (2 ^ n), donde n es el número de bits. Considere un nuevo algoritmo que se ejecuta n ^ 100 más rápido. Esto significa que mi nuevo proceso se ejecuta en O (2 ^ n / n ^ 100). Sin embargo, en el mundo de la criptografía, una aceleración polinómica a un algoritmo exponencial no se considera tradicionalmente como una aceleración teórica. Al hacer pruebas de seguridad, se supone que un atacante puede descubrir una de estas aceleraciones y que no tendrá ningún efecto.
Entonces, en una circunstancia, podemos cambiar un O (n) a O (n) y llamarlo más rápido. En una circunstancia diferente, podemos cambiar un O (2 ^ n) a O (2 ^ n / n ^ 100), y afirmar que no hubo una aceleración significativa en absoluto. Por eso digo que no hay una definición unificada para un "algoritmo más rápido". Siempre depende del contexto.
fuente
Usando las reglas de límites, también podemos escribir:
fuente