Algoritmo determinista simple y práctico, tiempo de ejecución complicado

18

Muy a menudo, si el tiempo de ejecución de un algoritmo es una expresión complicada, el algoritmo en sí también es complicado y poco práctico. Cada una de las raíces cúbicas y los factores en el tiempo de ejecución asintótico tienden a agregar complejidad al algoritmo y también a factores constantes ocultos en el tiempo de ejecución.Iniciar sesiónIniciar sesiónnorte

¿Tenemos ejemplos sorprendentes en los que esta regla general falla?

Por supuesto, es fácil encontrar ejemplos de algoritmos que son muy difíciles de implementar a pesar de que tienen un tiempo de ejecución muy simple en el peor de los casos. ¿Pero qué hay de lo contrario?

¿Tenemos ejemplos de algoritmos deterministas muy simples y prácticos que sean fáciles de implementar pero que tengan una expresión muy complicada como su peor tiempo de ejecución asintótico?

Tenga en cuenta las palabras clave "determinista" y "peor de los casos"; El análisis de algoritmos aleatorios simples conduce con bastante facilidad a expresiones complicadas.

Por supuesto, lo que es "complicado" es una cuestión de gustos. De todos modos, preferiría ver una expresión que sea demasiado fea para poner en el título de su artículo. Y preferiría una función complicada de un parámetro natural (tamaño de entrada, número de nodos, etc.).


PD. Pensé que no haría de esto una "pregunta de la lista grande", y no CW. Me gustaría encontrar un solo ejemplo excelente (si es que existe). Por lo tanto, publique otra respuesta solo si cree que es "mejor" que cualquiera de las respuestas hasta ahora.

Jukka Suomela
fuente
2
¿El algoritmo de prueba de primalidad AKS califica como respuesta? Estoy dudando porque el "complicatedness" de su tiempo de ejecución es, en cierto sentido, a raíz de la pseudoaleatoriedad de la distribución de los números primos ...
arnab
Creo que el peor de los casos es, en la mayoría de los casos, algo que causa "atropello todo" y que todo es lo que medimos en tiempo de ejecución. Entonces, naturalmente, los algoritmos fáciles tienen tiempos de ejecución WC fáciles. Los tiempos de ejecución complicados surgen si intentamos afeitarnos un poco con algún truco. Pero tu pregunta es interesante; Ciertamente tengo curiosidad por ver si mi sentimiento es correcto.
Raphael el
@arnab: Gracias, AKS es una buena idea. ¿Pero no estoy seguro de si podemos llamarlo "práctico"?
Jukka Suomela
¿Los esquemas de paso de mensajes como la propagación de encuestas, la propagación de restricciones o la TRW secuencial cuentan como "algoritmos"? Fácil de implementar, el tiempo de ejecución es difícil de predecir
Yaroslav Bulatov el
Vaya, siempre me gusta el método rho de Pollard, es simple y práctico, y el análisis es realmente difícil, pero la aleatoriedad del algoritmo lo hace incondicional como respuesta a la publicación ...
Hsien-Chih Chang 張顯 之

Respuestas:

20

El mejor ejemplo que se me ocurre es un algoritmo (descrito a continuación) para calcular el nivel en una disposición de líneas en el plano, es decir, la línea poligonal formada por los puntos que tienen exactamente líneas verticalmente por encima. Este no es el algoritmo más eficiente conocido para el problema. Hay algoritmos más eficientes con complejidades más simples, pero creo que este es más práctico que la mayoría (si no todos) de ellos. El análisis probablemente no es estricto, porque utiliza la complejidad de nivel , que es un famoso problema abierto (creo que todos los demás términos en el análisis son estrictos). Aún así, dudo que los límites mejorados para -level harían el tiempo de ejecución mucho más simple. Asumirén k k k k = n / 2 nknkkkk=n/2para escribir la complejidad en función de solo.norte

El algoritmo se basa en el paradigma de barrido de línea y utiliza dos torneos cinéticos -ary como colas de prioridad cinéticas. Las inserciones y eliminaciones se realizan cuando una línea va por encima o por debajo del nivel , moviendo una línea de un torneo cinético a otro. Por lo tanto, hay inserciones y eliminaciones (usando el límite de Dey para la complejidad de nivel ). Cada evento se procesa en tiempo y hay eventos (el proviene del complejidad de la envoltura superior de arreglos de segmentos de línea, mientras que proviene de la altura de unk O ( n 4 / 3 ) k O ( log n ) O ( n 4 / 3 α ( n ) log n / log log n ) α ( n ) log n / log log n ( log n )(Iniciar sesiónnorte)kO(norte4 4/ /3)kO(Iniciar sesiónnorte)O(norte4 4/ /3α(norte)Iniciar sesiónnorte/ /Iniciar sesiónIniciar sesiónnorte)α(norte)Iniciar sesiónnorte/ /Iniciar sesiónIniciar sesiónnorte(Iniciar sesiónnorte) -ary tree). El tiempo total de ejecución es

O(norte4 4/ /3α(norte)Iniciar sesión2norte/ /Iniciar sesiónIniciar sesiónnorte).

Consulte el manuscrito de Timothy Chan http://www.cs.uwaterloo.ca/~tmchan/lev2d_7_7_99.ps.gz para obtener más detalles y referencias. El factor se puede eliminar mediante el uso de un torneo cinético binario (en lugar de -ary), pero en realidad acelera la cola de prioridad cinética en las pruebas que realicé. La complejidad debería ser un poco más fea y peor (mientras que el algoritmo seguirá siendo práctico) si se usa un montón cinético en lugar de un torneo cinético ( debería aparecer un dentro de una raíz cuadrada).( log n ) log1/ /Iniciar sesiónIniciar sesiónnorte(Iniciar sesiónnorte)Iniciar sesión

Guilherme D. da Fonseca
fuente
Excelente ejemplo, gracias! Esto no va a ser fácil de superar. :)
Jukka Suomela
1
Este algoritmo es más lento en la práctica que los algoritmos aleatorios, que son bastante fáciles de poner en práctica (como alguien que implementó uno de estos algoritmos (ver mi artículo "Dar un paseo en una disposición plana").
Sariel Har-Peled
He aceptado esta respuesta, ya que parece estar más cerca de lo que tenía en mente. Pero si alguien tiene alguna idea nueva, ¡me encantaría saberlo!
Jukka Suomela
24

Las operaciones de estructura de datos de búsqueda de unión parecen cumplir con sus criterios:

http://en.wikipedia.org/wiki/Disjoint-set_data_structure

Kevin Wortman
fuente
2
De hecho, publiqué la misma respuesta pero la eliminé después de notar que me ganaste. :) Algoritmo simple y elegante que incluso un no teórico podría descubrir, pero la complejidad amortizada inversa de Ackermann.
Warren Schudy
Bueno, de tiempo que no se ve "complicado" si se compara con O ( n 4 / 3 α ( n ) log 2 n / log log n ) en la respuesta de Guilherme. :)O(α(norte))O(norte4 4/ /3α(norte)Iniciar sesión2norte/ /Iniciar sesiónIniciar sesiónnorte)
Jukka Suomela
La relación entre la longitud del algoritmo y la complejidad de la prueba para union-find es probablemente inmejorable: ¿las tres operaciones son qué, nueve líneas de código?
Neel Krishnaswami
1
No creo que la pregunta sea sobre un algoritmo simple y práctico con análisis complejo . Creo que la pregunta es sobre un algoritmo simple y práctico con tiempo de ejecución complejo , es decir, la expresión real obtenida para el límite superior.
Guilherme D. da Fonseca
6

Algoritmo simple. Fácil de implementar y funciona maravillosamente en la práctica, pero es un desastre analizarlo teóricamente.

Mohit Singh
fuente
norte
En realidad, se sabe que el simplex toma tiempo exponencial en el peor de los casos a través de la construcción Klee-Minty. No es, creo, un ejemplo de lo que pregunta Jukka
Suresh Venkat
1
Tal vez debería haber dicho el método simplex en lugar del algoritmo simplex. El cubo Klee-Minty y sus variaciones funcionan para algunas reglas pivotantes de vainilla. Pero, por ejemplo, la regla de giro aleatorio de facetas tiene un límite superior loco y (reciente) inferior. Gil Kalai tuvo una buena entrada en el blog sobre los resultados recientes. gilkalai.wordpress.com/2010/11/09/…
Mohit Singh
Buen punto, Mohit. Estaba confundido también.
Suresh Venkat
2

No estoy seguro si considera esto "práctico", pero es un famoso problema abierto. Paul Erdos dijo sobre la conjetura de Collatz: "Las matemáticas aún no están listas para tales problemas"

X=1

Mohammad Al-Turkistany
fuente
¿Y cuál es el problema resuelto por este algoritmo ...?
Jukka Suomela
Sugiere buscar nuevas técnicas de análisis de tiempo de ejecución.
Mohammad Al-Turkistany
2
entonces se podría decir que una búsqueda por fuerza bruta de una prueba de la conjetura de Collatz también motiva "nuevas técnicas de análisis de tiempo de ejecución"; en ambos casos, el algoritmo simplemente explora sin pensar un dígrafo. La conjetura de Collatz es divertida, pero no creo que sea un ejemplo interesante de "un algoritmo".
Niel de Beaudrap
2

Este ejemplo, si bien no cumple con la carta de su solicitud, puede ser de interés porque tiene cierta afinidad espiritual. Específicamente, la cuestión de clasificar pilas de panqueques y panqueques quemados por reversiones.

http://en.wikipedia.org/wiki/Pancake_sorting

Un área de aplicación es la biología computacional (genética) donde las preguntas sobre los reordenamientos del genoma pueden formularse en términos de la distancia entre permutaciones utilizando reversiones de piezas de permutaciones sujetas a varias reglas.

Joseph Malkevitch
fuente