¿Qué es un algoritmo eficiente?

10

Desde el punto de vista del comportamiento asintótico, ¿qué se considera un algoritmo "eficiente"? ¿Cuál es el estándar / razón para dibujar la línea en ese punto? Personalmente, pensaría que cualquier cosa que sea ingenuamente llamaría "subpolinomio", de modo que como sería eficiente y cualquier cosa que sea sería "ineficiente". Sin embargo, he escuchado que todo lo que sea de cualquier orden polinómico se llama eficiente. ¿Cuál es el razonamiento?n 1 + ϵ Ω ( n 2 )F(norte)=o(norte2)norte1+ϵΩ(norte2)

Robert S. Barnes
fuente

Respuestas:

11

Eso depende del contexto. En informática teórica, generalmente cada algoritmo de tiempo polinómico se considera "eficiente". En algoritmos de aproximación, por ejemplo, un tiempo de ejecución de se consideraría eficiente, aunque en la práctica no se podrá utilizar para ningún valor razonable de . Un algoritmo para SAT que se ejecuta en sería un avance sorprendente. ϵ n 2 100norte1/ /ϵ1/ /ϵϵnorte2100

En algoritmos clásicos, es decir, algoritmos de los años 80 y anteriores, los tiempos de ejecución inferiores a o menos (piense en la multiplicación de matrices, la coincidencia de costos mínimos, los flujos, la programación lineal) se consideran eficientes. Todavía son considerados eficientes por la mayoría de las personas, diría. Por supuesto, un algoritmo no se considera eficiente si se conoce un algoritmo , como por ejemplo para la clasificación.n 2 n log nnorte3norte2norteIniciar sesiónnorte

Hoy en día existe una tendencia hacia algoritmos sublineales o algoritmos de transmisión que pueden manejar terabytes de datos. Intente usar la multiplicación de matrices para calcular el rango de página de todas las páginas en el índice de Google. Eso no funcionará.

Por supuesto, aunque ciertamente es útil, el tiempo de ejecución asintótico de un algoritmo no cuenta toda la historia. Hay algoritmos que tienen un buen tiempo de ejecución asintótico, pero constantes que son tan grandes que efectivamente no se pueden usar. Siempre. Lipton los llama Algoritmos Galácticos . Robert Sedgewick incluso afirma que los límites del peor de los casos son "a menudo inútiles para la predicción, a menudo inútiles para las garantías" y "el análisis del peor de los casos es inútil para predecir el rendimiento" en su discurso Poniendo la ciencia de nuevo en informática .

adrianN
fuente
99
En resumen: eficiente es lo que resuelve su problema en un marco de tiempo que le convenga.
Raphael
Esto realmente no necesita su propia respuesta, pero BPP, que es la clase de funciones con tiempo de ejecución polinomial (como se describe en la respuesta) también con aleatoriedad, a menudo se considera eficiente. En otras palabras, lo anterior es correcto, pero las computadoras generalmente pueden acceder a la aleatoriedad para hacer cálculos. Uno de los usos prácticos más importantes de la aleatoriedad es el hashing.
SamM
¿Quizás "eficiente" no es realmente la terminología correcta en primer lugar? Estaba revisando uno de mis libros de cálculo, y el autor llama a los tiempos de ejecución polinomiales "manejables" y los tiempos de ejecución exponenciales "intratables".
Robert S. Barnes
1
@ RobertS.Barnes: diferentes palabras, mismo problema.
Raphael
4

Mis 2 centavos desde el ángulo de los algoritmos distribuidos: cuando se observan redes a gran escala (P2P, redes sociales, etc.), un algoritmo distribuido se considera eficiente si su tiempo de ejecución es para alguna constante c > 0 y el algoritmo utiliza mensajes de bits O ( log n ) . Tenga en cuenta que el requisito sobre el tamaño de los mensajes suele tener incluso más importancia que el tiempo de ejecución, en particular para problemas "globales" que tienen un límite inferior más grande en el tiempo de ejecución, por ejemplo, MST distribuido.O(Iniciar sesiónCnorte)C>0 0 O(Iniciar sesiónnorte)

Peter
fuente
3

El razonamiento detrás es que, desde la perspectiva del comportamiento asintótico, una tasa de crecimiento polinomial es trivialmente menor que una tasa de crecimiento superpolinomial. En la práctica, un algoritmo de tiempo polinomial se ejecuta mucho más rápido que un algoritmo de tiempo superpolinomial cuando aumenta el tamaño de entrada.

Por supuesto, nadie diría que un algoritmo con una complejidad polinómica de, por ejemplo, es "eficiente", pero la mayoría de los algoritmos rara vez excede una complejidad de O ( n 5 ) .O(norte2000)O(norte5 5)

O(norte2)

Massimo Cafaro
fuente
3

En teoría, se dice que un algoritmo es eficiente si su peor tiempo de ejecución está limitado por un polinomio en su longitud de entrada. El razonamiento es que los polinomios tienen buenas propiedades de cierre. Agregar, multiplicar y componer polinomios son operaciones que producen polinomios y son buenas si se reducen los problemas entre sí.

Por supuesto, la brecha entre polinomio y exponencial se vuelve muy grande a medida que aumenta la longitud de entrada, por lo que los algoritmos de tiempo polinomial son mucho mejores. En la práctica, un algoritmo de tiempo polinómico puede tardar mucho tiempo antes de la terminación, pero podría ser el caso de que sea un algoritmo óptimo (el mejor posible), en cuyo caso diría que es eficiente.

saadtaame
fuente
Si bien puedo entender que si algo es el algoritmo más rápido conocido para un problema en particular, entonces podría considerarse "eficiente" desde ese punto de vista, es difícil para mí pensar que todo lo que se ejecuta en polytime es eficiente. :-)
Robert S. Barnes
Para tiempos de ejecución polinomiales, "eficiente" es solo una palabra, y una palabra engañosa.
Raphael
@Raphael ¿Quizás tractable es una mejor palabra para usar ...?
Robert S. Barnes
1
@ RobertS.Barnes: No mucho mejor, en mi humilde opinión. "Tractable" es tan relativo como "eficiente".
Raphael
0

norte3norte2

gnasher729
fuente
Θ