A razão para usar a tecla de diminuição em vez de reinserir nós é manter pequeno o número de nós na fila de prioridade, mantendo assim o número total de desenfileiramentos da fila de prioridade pequeno e o custo de cada equilíbrio de fila de prioridade baixo.
Em uma implementação do algoritmo de Dijkstra que reinsere nós na fila de prioridade com suas novas prioridades, um nó é adicionado à fila de prioridade para cada uma das m arestas do gráfico. Isso significa que há operações de enfileiramento e operações de desenfileiramento na fila de prioridade, dando um tempo de execução total de O (m T e + m T d ), onde T e é o tempo necessário para enfileirar na fila de prioridade e T d é o tempo necessário para retirar da fila de prioridade.
Em uma implementação do algoritmo de Dijkstra que suporta chave de diminuição, a fila de prioridade que contém os nós começa com n nós e em cada etapa do algoritmo remove um nó. Isso significa que o número total de retiradas da fila de heap é n. Cada nó terá a tecla de diminuição chamada potencialmente uma vez para cada aresta que conduz a ele, então o número total de teclas de diminuição feitas é no máximo m. Isso dá um tempo de execução de (n T e + n T d + m T k ), onde T k é o tempo necessário para chamar a tecla de diminuição.
Então, que efeito isso tem no tempo de execução? Isso depende de qual fila de prioridade você usa. Aqui está uma tabela rápida que mostra as diferentes filas de prioridade e os tempos de execução gerais das diferentes implementações do 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 você pode ver, com a maioria dos tipos de filas de prioridade, realmente não há diferença no tempo de execução assintótico, e a versão de diminuição da chave provavelmente não se sairá muito melhor. No entanto, se você usar uma implementação de heap de Fibonacci da fila de prioridade, então, de fato, o algoritmo de Dijkstra será assintoticamente mais eficiente ao usar a tecla de diminuição.
Resumindo, usar a tecla de diminuição, mais uma fila de boa prioridade, pode diminuir o tempo de execução assintótico de Dijkstra além do que é possível se você continuar fazendo enfileiramentos e desfileiramentos.
Além desse ponto, alguns algoritmos mais avançados, como o algoritmo de caminhos mais curtos de Gabow, usam o algoritmo de Dijkstra como uma sub-rotina e dependem fortemente da implementação de teclas de diminuição. Eles usam o fato de que, se você souber o intervalo de distâncias válidas com antecedência, poderá construir uma fila de prioridades supereficiente com base nesse fato.
Espero que isto ajude!