Причиною використання клавіші зменшення, а не повторного вставлення вузлів, є збереження невеликої кількості вузлів у черзі пріоритетів, таким чином, загальна кількість вилучень черг пріоритетів невелика, а вартість кожного балансу черги пріоритетів низькою.
У реалізації алгоритму Дейкстри, який повторно вставляє вузли в чергу пріоритетів зі своїми новими пріоритетами, один вузол додається до черги пріоритетів для кожного з 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)
Як бачите, у більшості типів пріоритетних черг насправді немає різниці в асимптотичному виконанні, і версія із зменшувальним ключем, швидше за все, не набагато краще. Однак якщо ви використовуєте реалізацію купи Фібоначчі для черги пріоритетів, тоді алгоритм Дейкстри буде асимптотично ефективнішим при використанні клавіші зменшення.
Коротше кажучи, використання клавіші зменшення плюс черги з хорошим пріоритетом може вивести асимптотичний час виконання Дейкстри за межі можливого, якщо ви продовжуєте робити черги та зміни.
Окрім цього, деякі більш досконалі алгоритми, такі як Алгоритм найкоротших шляхів Габова, використовують алгоритм Дейкстри як підпрограму і значною мірою покладаються на реалізацію клавіші зменшення. Вони використовують той факт, що якщо ви знаєте діапазон допустимих відстаней заздалегідь, ви можете створити надзвичайно ефективну чергу пріоритетів на основі цього факту.
Сподіваюся, це допомагає!