Una pregunta reciente discutió el algoritmo de programación dinámica ahora clásico para TSP, debido independientemente a Bellman y Held-Karp . Universalmente se informa que el algoritmo se ejecuta en tiempo . Sin embargo, como señaló recientemente uno de mis alumnos, este tiempo de ejecución puede requerir un modelo de computación irrazonablemente poderoso.
Aquí hay una breve descripción del algoritmo. La entrada consiste en un gráfico dirigido con vértices y una función de longitud no negativa . Para cualquier vértice y , y cualquier subconjunto de vértices que excluya y , deje que denote la longitud del camino hamiltoniano más corto de a en el subgrafo inducido . El algoritmo de Bellman-Held-Karp se basa en la siguiente recurrencia (o como a los economistas y teóricos del control les gusta llamarlo, "ecuación de Bellman"):
Para cualquier vértice , la duración del recorrido óptimo del vendedor itinerante es L ( s , V ∖ { s } , s ) . Debido a que el primer parámetro s es constante en todas las llamadas recursivas, hay Θ ( 2 n n ) subproblemas diferentes, y cada subproblema depende de, como máximo, n otros. Por lo tanto, el algoritmo de programación dinámica se ejecuta en tiempo O ( 2 n n 2 ) .
¿O sí?
El modelo estándar de RAM entera permite la manipulación en tiempo constante de enteros con bits , pero al menos para operaciones aritméticas y lógicas , los enteros más grandes deben dividirse en fragmentos de tamaño de palabra. (De lo contrario, pueden suceder cosas extrañas ). ¿No es esto también cierto para el acceso a direcciones de memoria más largas? Si un algoritmo usa espacio superpolinomial, ¿es razonable suponer que los accesos a la memoria requieren solo un tiempo constante?
Para el algoritmo Bellman-Held-Karp en particular, el algoritmo debe transformar la descripción del subconjunto en la descripción del subconjunto X ∖ { v } , para cada v , a fin de acceder a la tabla de memorización. Si los subconjuntos están representados por enteros, estos enteros requieren n bits y, por lo tanto, no pueden manipularse en tiempo constante; Si no están representados por enteros, su representación no se puede usar directamente como un índice en la tabla de memorización.
Entonces: ¿Cuál es el tiempo de ejecución asintótico real del algoritmo Bellman-Held-Karp?