La razón para usar la clave de reducción en lugar de reinsertar nodos es mantener pequeño el número de nodos en la cola de prioridad, manteniendo así el número total de eliminaciones de cola de prioridad pequeño y el costo de cada saldo de cola de prioridad bajo.
En una implementación del algoritmo de Dijkstra que reintroduce nodos en la cola de prioridad con sus nuevas prioridades, se agrega un nodo a la cola de prioridad para cada uno de los m bordes en el gráfico. Esto significa que hay operaciones en cola y operaciones en cola en la cola de prioridad, lo que da un tiempo de ejecución total de O (m T e + m T d ), donde T e es el tiempo necesario para ingresar en la cola de prioridad y T d es el tiempo necesario para salir de la cola de prioridad.
En una implementación del algoritmo de Dijkstra que admite la clave de disminución, la cola de prioridad que contiene los nodos comienza con n nodos y en cada paso del algoritmo se elimina un nodo. Esto significa que el número total de eliminaciones de cola del montón es n. Cada nodo tendrá una clave de disminución llamada potencialmente una vez por cada borde que lo ingrese, por lo que el número total de claves de disminución realizadas es como máximo m. Esto da un tiempo de ejecución de (n T e + n T d + m T k ), donde T k es el tiempo requerido para llamar a la tecla de disminución.
Entonces, ¿qué efecto tiene esto en el tiempo de ejecución? Eso depende de la cola de prioridad que utilice. Aquí hay una tabla rápida que muestra diferentes colas de prioridad y los tiempos de ejecución generales de las diferentes implementaciones del algoritmo de Dijkstra:
Queue | T_e | T_d | T_k | w/o Dec-Key | w/Dec-Key
---------------+--------+--------+--------+-------------+---------------
Binary Heap |O(log N)|O(log N)|O(log N)| O(M log N) | O(M log N)
Binomial Heap |O(log N)|O(log N)|O(log N)| O(M log N) | O(M log N)
Fibonacci Heap | O(1) |O(log N)| O(1) | O(M log N) | O(M + N log N)
Como puede ver, con la mayoría de los tipos de colas de prioridad, realmente no hay una diferencia en el tiempo de ejecución asintótico, y es probable que la versión de clave reducida no funcione mucho mejor. Sin embargo, si usa una implementación de montón de Fibonacci de la cola de prioridad, entonces, de hecho, el algoritmo de Dijkstra será asintóticamente más eficiente cuando use la tecla de disminución.
En resumen, usar la tecla de disminución, además de una buena cola de prioridad, puede reducir el tiempo de ejecución asintótico de Dijkstra más allá de lo que es posible si sigue haciendo cola y quita de cola.
Además de este punto, algunos algoritmos más avanzados, como el algoritmo de rutas más cortas de Gabow, utilizan el algoritmo de Dijkstra como una subrutina y dependen en gran medida de la implementación de la clave decreciente. Usan el hecho de que si conoce el rango de distancias válidas de antemano, puede construir una cola de prioridad súper eficiente basada en ese hecho.
¡Espero que esto ayude!