¿Ejemplo de un algoritmo en el que un término de bajo orden domina el tiempo de ejecución para cualquier entrada práctica?

10

La notación Big-O oculta factores constantes, por lo que existen algunos algoritmos que no son factibles para cualquier tamaño de entrada razonable porque el coeficiente en el término n es muy grande.O(norte)norte

¿Hay algún algoritmo conocido cuyo tiempo de ejecución sea pero con algún término de bajo orden o ( f ( n ) ) que sea tan grande que para tamaños de entrada razonables domine completamente el tiempo de ejecución? Me gustaría usar un algoritmo como este como un ejemplo en un curso de algoritmos, ya que da una buena razón por la cual la notación big-O no es todo.O(F(norte))o(F(norte))

¡Gracias!

templatetypedef
fuente
Algoritmos que primero configuran una tabla grande y luego realizan búsquedas rápidas en la tabla para cada elemento de entrada. Si la tabla es lo suficientemente grande, entonces el número de artículos tiene que ser enorme para compensar el costo de crear la tabla. Los motores de búsqueda son un ejemplo, si es el número de consultas. norte
András Salamon
Escuché que la programación lineal es así. Simplex es exponencial pero más rápido que los algoritmos polinómicos en la práctica.
jmite
1
No conozco ningún algoritmo que se ajuste a sus necesidades, pero buscaría algo que tenga como máximo tiempo de ejecución lineal, ya que más allá de eso dudaría mucho de que los términos más pequeños puedan dominar el término principal para las entradas más razonables. Pero tal vez k-way mergesort se adapte a sus necesidades, cuando se utiliza para ordenar grandes datos El problema es minimizar los accesos a la memoria secundaria, ya que cuestan una gran cantidad de tiempo, aunque no estoy completamente seguro de que ese sea un ejemplo apropiado de lo que quieres demostrar, y realmente no creo que sea lo suficientemente simple como para ser ilustrativo
G. Bach
algo similar a algoritmos poderosos demasiado complejos para implementar , también vea blog de rjlipton sobre algoritmos galácticos
vzn

Respuestas:

2

La criptografía es un ejemplo, si es degenerada. Por ejemplo, romper el cifrado AES es : todo lo que tiene que hacer es encontrar la clave correcta entre un número finito, 2 128 o 2 192 o 2 256 dependiendo del tamaño de la clave (suponga que se conoce suficiente cantidad del texto plano) determinar la clave sin ambigüedades). Sin embargo, incluso 2 128 operaciones tomarían todas las computadoras hoy (mil millones o más o menos, cada una haciendo alrededor de mil millones de operaciones por escenario) más que la vida útil del universo (aproximadamente mil millones de segundos).O(1)2128219222562128


Una forma ligeramente diferente de ilustrar por qué big-O no lo es todo es comentar que a veces usamos un algoritmo diferente para tamaños de entrada pequeños. Por ejemplo, toma quicksort. Con la elección correcta de pivote (¡lo cual es un negocio complicado!), Es . Quicksort opera dividiendo y conquistando: cada instancia implica hacer una gran cantidad de arreglos pequeños. Para matrices pequeñas, los métodos cuadráticos, como la clasificación por inserción, funcionan mejor. Por lo tanto, para obtener el mejor rendimiento, una selección rápida de una gran matriz implica muchas ejecuciones de clasificación de inserción para tamaños pequeños.O(nlgn)

Gilles 'SO- deja de ser malvado'
fuente
No creo que romper el cifrado sea un ejemplo razonable aquí; Una cosa es que para analizar el problema de encontrar la clave correcta asintóticamente, tendríamos que considerar las versiones teóricamente disponibles de Rijndael con un tamaño de clave no constante, es decir, romper la clave para claves de tamaño . De lo contrario, podríamos decir que cualquier algoritmo que termine funciona en O ( 1 ) para entrada de tamaño fijo. norteO(1)
G. Bach
@ G.Bach El punto de este ejemplo es que no es factible (que la teoría de la complejidad asocia con alta complejidad) a pesar de que es de tiempo constante (en términos del tamaño del texto cifrado).
Gilles 'SO- deja de ser malvado'
2
No creo que tu primer ejemplo funcione. Dado que solo hay muchas opciones para verificar, el tiempo de ejecución del algoritmo es , por lo que no hay un término o ( 1 ) de orden inferior que explique el tiempo de ejecución completo. O(1)o(1)
templatetypedef
1
@templatetypedef Romper el cifrado de un mensaje cifrado con AES es en términos de la longitud del mensaje . O(1)
Gilles 'SO- deja de ser malvado'
1

Me vienen a la mente dos ejemplos del campo de la complejidad parametrizada y los algoritmos FPT. Puede que esto no sea exactamente lo que está buscando, pero aquí va.

Considere un problema gráfico, como 3-COLORING o HAM-CYCLE. Ambos problemas pueden expresarse en lógica monádica de segundo orden y, por lo tanto, pueden decidirse en tiempo lineal de gráficos con ancho de árbol acotado. Este es el resultado de Bruno Courcelle , pero el algoritmo resultante está lejos de ser práctico.

O(pags9 9pags/ /2)LO(pags2pagsL)pagsL

Juho
fuente
2
O(norte)o(norte)
0

algo relacionado con su pregunta son los algoritmos que se sabe que tienen un buen rendimiento teóricamente pero que no se utilizan en problemas reales debido a la falta de practicidad en instancias más pequeñas. en otras palabras, como usted solicita, el "rendimiento anunciado" solo es posible para entradas grandes en teoría, que no se ven en aplicaciones prácticas. esto a veces se refleja en las estimaciones de Big-Oh, otras veces no exactamente. algunos algoritmos tienen un buen "rendimiento" teórico pero son muy complejos desde el punto de vista lógico y nunca han sido implementados por nadie, y por lo tanto, el "rendimiento" en tamaños de instancias prácticas ni siquiera se conoce, por ejemplo, como en el problema del flujo máximo .

vzn
fuente
¿Pero son poco prácticos porque dominan los términos de orden inferior o porque las constantes en los términos de orden superior son malas?
David Richerby
o, o una combinación, sería difícil aislar en cada caso. efectivamente / prácticamente es el mismo efecto.
vzn
-1

Esto es una especie de broma pero tiene un lado serio ...

O(norteIniciar sesiónnorte)O(norte2)

David Richerby
fuente
1
No, eso es diferente. Quicksort es útil en la práctica porque no hay un término cuadrático para la entrada típica, sin importar cuán grande sea el tamaño. Si la elección del pivote es mala para un diseño de datos, el ordenamiento rápido exhibe un comportamiento cuadrático incluso para entradas pequeñas.
Gilles 'SO- deja de ser malvado'