Lý do sử dụng khóa giảm hơn là chèn lại các nút là để giữ cho số lượng nút trong hàng đợi ưu tiên nhỏ, do đó giữ cho tổng số hàng đợi ưu tiên nhỏ hơn và chi phí của mỗi số dư hàng ưu tiên thấp.
Trong việc triển khai thuật toán Dijkstra đưa các nút vào hàng đợi ưu tiên với các mức độ ưu tiên mới của chúng, một nút được thêm vào hàng đợi ưu tiên cho mỗi cạnh trong số m cạnh trong biểu đồ. Điều này có nghĩa là có m thao tác xếp hàng và m thao tác xếp hàng trên hàng đợi ưu tiên, cho tổng thời gian chạy là O (m T e + m T d ), trong đó T e là thời gian cần thiết để xếp vào hàng đợi ưu tiên và T d là thời gian cần thiết để xếp hàng từ hàng đợi ưu tiên.
Trong quá trình triển khai thuật toán Dijkstra hỗ trợ khóa giảm, hàng đợi ưu tiên giữ các nút bắt đầu với n nút trong đó và trên mỗi bước của thuật toán sẽ loại bỏ một nút. Điều này có nghĩa là tổng số thứ tự của đống là n. Mỗi nút sẽ có khóa giảm được gọi trên đó một lần cho mỗi cạnh dẫn vào nó, vì vậy tổng số khóa giảm được thực hiện tối đa là m. Điều này cho ta thời gian chạy là (n T e + n T d + m T k ), trong đó T k là thời gian cần thiết để gọi phím giảm.
Vậy điều này có ảnh hưởng gì đến thời gian chạy? Điều đó phụ thuộc vào hàng đợi ưu tiên bạn sử dụng. Dưới đây là một bảng nhanh hiển thị các hàng đợi ưu tiên khác nhau và thời gian chạy tổng thể của các triển khai thuật toán Dijkstra khác nhau:
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)
Như bạn có thể thấy, với hầu hết các loại hàng đợi ưu tiên, thực sự không có sự khác biệt trong thời gian chạy tiệm cận và phiên bản khóa giảm có khả năng làm tốt hơn. Tuy nhiên, nếu bạn sử dụng triển khai đống Fibonacci của hàng đợi ưu tiên, thì thực sự thuật toán Dijkstra sẽ tiệm cận hiệu quả hơn khi sử dụng phím giảm.
Nói tóm lại, việc sử dụng phím giảm, cộng với hàng đợi ưu tiên tốt, có thể làm giảm thời gian chạy tiệm cận của Dijkstra vượt quá những gì có thể nếu bạn tiếp tục xếp hàng và xếp hàng.
Bên cạnh điểm này, một số thuật toán nâng cao hơn, chẳng hạn như Thuật toán các đường ngắn nhất của Gabow, sử dụng thuật toán Dijkstra như một chương trình con và phụ thuộc nhiều vào việc triển khai khóa giảm. Họ sử dụng thực tế rằng nếu bạn biết trước phạm vi khoảng cách hợp lệ, bạn có thể xây dựng hàng đợi ưu tiên siêu hiệu quả dựa trên thực tế đó.
Hi vọng điêu nay co ich!