Mi hijo de 8 años se ha aburrido creando laberintos convencionales y ha comenzado a crear variantes que se parecen a esto:
La idea es comenzar desde x y alcanzar o a través de las reglas normales. Además, puede "saltar" de cualquier número entero a cualquier otro número entero , pero usted debe pagardólares por el privilegio. El objetivo es resolver el laberinto al menor costo. En el ejemplo anterior, podríamos ir de xo a través de x-14-18-27-28-o al costo 5, pero es más barato ir x-13-11-9-8-29-28-o por solo 4)b | a - b |
Así que aquí está mi pregunta: ¿cuál es la mejor solución (en términos de tiempo de ejecución asintótico) que se le ocurra para resolver esto? Puede hacer suposiciones razonables sobre el formato de entrada.
Nota: Estoy usando la etiqueta "rompecabezas" aquí porque tengo en mente una respuesta , pero no estoy seguro de que sea óptima y me gustaría ver si alguien más puede mejorar mi solución. (Aquí es el número de enteros en el laberinto).n
Respuestas:
Puede resolver esto en tiempo usando una variación del algoritmo de Dijkstra. Podemos evitar no realizar todas las actualizaciones de distancia cuando visitamos un nuevo nodo. Si visitamos un nodo , solo necesitamos actualizar las distancias de todo lo que se puede caminar de a 0, y actualizar las distancias a los dos nodos e con los valores más cercanos a menos y mayores que que no tienen ha sido elegido todavía.y y y - y + y yO(nlogn) y y y− y+ y y
Estas actualizaciones son suficientes para mantener el montón devolviendo el elemento mínimo porque cualquier nodo más cercano al que salte debe haber estado numéricamente justo encima o justo debajo de un nodo ya visitado.
Cada nodo se actualiza a 0 como máximo una vez (si sacamos todos los nodos de distancia cero de la cola para evitar el comportamiento cuadrático), y cada vez que agregamos un nodo, solo hacemos O (1) otras actualizaciones. Encontrar los valores e se puede hacer en tiempo lineal si también mantenemos una lista ordenada doblemente vinculada de todos los nodos, ordenados por sus valores enteros. La creación de esta lista doblemente vinculada lleva tiempo , y finalmente el actualiza y aparece desde el montón, toma tiempo , para un tiempo de ejecución total dey + O ( n log n ) O ( n ) O ( n log n ) O ( n log n )y− y+ O(nlogn) O(n) O(nlogn) O(nlogn)
fuente
Parece natural convertir esto en el problema de la ruta más corta con un nodo inicial especial (x) y un nodo final (0). También habría otro nodo para cada uno de los números. Tanto x como 0 tienen bordes de peso 0 para todos los nodos de números que son accesibles en el laberinto. Todos los nodos numéricos están conectados con el peso 0 (si los números son accesibles por el laberinto) o con la diferencia entre los números (si no son accesibles por el laberinto).
fuente