Причина использования ключа уменьшения вместо повторной вставки узлов состоит в том, чтобы сохранить небольшое количество узлов в очереди с приоритетами, таким образом, сохраняя небольшое общее количество исключений очереди с приоритетами и низкую стоимость каждого баланса очереди с приоритетами.
В реализации алгоритма Дейкстры, который повторно вставляет узлы в приоритетную очередь с их новыми приоритетами, один узел добавляется в приоритетную очередь для каждого из m ребер в графе. Это означает, что в приоритетной очереди есть m операций постановки в очередь и m операций постановки из очереди, что дает общее время выполнения O (m T e + m T d ), где T e - время, необходимое для постановки в очередь с приоритетом, а T d - время, необходимое для выхода из очереди с приоритетом.
В реализации алгоритма Дейкстры, который поддерживает уменьшение ключа, приоритетная очередь, содержащая узлы, начинается с n узлов в ней и на каждом шаге алгоритма удаляет один узел. Это означает, что общее количество исключений из кучи равно n. Каждый узел будет иметь кнопку уменьшения, вызываемую потенциально один раз для каждого ребра, ведущего в него, поэтому общее количество выполненных ключей уменьшения не превышает m. Это дает время выполнения (n T e + n T d + m T k ), где T k - время, необходимое для вызова клавиши уменьшения.
Итак, как это влияет на время выполнения? Это зависит от того, какую приоритетную очередь вы используете. Вот краткая таблица, в которой показаны разные очереди приоритетов и общее время выполнения различных реализаций алгоритма Дейкстры:
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)
Как видите, с большинством типов очередей приоритетов действительно нет разницы в асимптотической среде выполнения, и версия с уменьшающимся ключом вряд ли будет намного лучше. Однако, если вы используете реализацию очереди приоритетов кучи Фибоначчи , тогда действительно алгоритм Дейкстры будет асимптотически более эффективным при использовании ключа уменьшения.
Короче говоря, использование клавиши уменьшения плюс хорошая очередь с приоритетом могут снизить асимптотическое время выполнения Дейкстры за пределы возможного, если вы продолжаете ставить в очередь и удалять из очереди.
Помимо этого, некоторые более продвинутые алгоритмы, такие как алгоритм кратчайшего пути Габоу, используют алгоритм Дейкстры в качестве подпрограммы и в значительной степени полагаются на реализацию с уменьшением ключа. Они используют тот факт, что если вы заранее знаете диапазон допустимых расстояний, вы можете построить суперэффективную очередь с приоритетом на основе этого факта.
Надеюсь это поможет!