Alasan untuk menggunakan kunci penurunan daripada memasukkan kembali node adalah untuk menjaga jumlah node dalam antrian prioritas kecil, sehingga menjaga jumlah total antrian prioritas kecil dan biaya setiap keseimbangan antrian prioritas rendah.
Dalam implementasi algoritma Dijkstra yang memasukkan kembali node ke dalam antrian prioritas dengan prioritas barunya, satu node ditambahkan ke antrian prioritas untuk setiap m edge dalam grafik. Ini berarti bahwa ada operasi antrian dan m operasi dequeue pada antrian prioritas, memberikan total runtime dari O (m T e + m T d ), di mana T e adalah waktu yang dibutuhkan untuk masuk ke antrian prioritas dan T d adalah waktu yang diperlukan untuk membatalkan antrean prioritas.
Dalam implementasi algoritma Dijkstra yang mendukung kunci-penurunan, antrian prioritas yang menahan node dimulai dengan n node di dalamnya dan pada setiap langkah algoritma menghapus satu node. Ini berarti jumlah heap dequeue adalah n. Setiap node akan memiliki kunci penurunan yang dipanggil secara potensial sekali untuk setiap tepi yang mengarah ke dalamnya, sehingga jumlah total kunci penurunan yang dilakukan paling banyak m. Ini memberikan runtime (n T e + n T d + m T k ), di mana T k adalah waktu yang dibutuhkan untuk memanggil tombol-menurun.
Jadi, apa efeknya pada runtime? Itu tergantung pada antrian prioritas apa yang Anda gunakan. Berikut adalah tabel singkat yang menunjukkan antrian prioritas yang berbeda dan keseluruhan runtime dari implementasi algoritma Dijkstra yang berbeda:
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)
Seperti yang Anda lihat, dengan sebagian besar jenis antrean prioritas, sebenarnya tidak ada perbedaan dalam runtime asimtotik, dan versi kunci kecil kemungkinan tidak akan bekerja lebih baik. Namun, jika Anda menggunakan implementasi tumpukan Fibonacci dari antrian prioritas, maka memang algoritme Dijkstra akan lebih efisien secara asimtotik saat menggunakan kunci penurunan.
Singkatnya, menggunakan kunci penurunan, ditambah antrean prioritas yang baik, dapat menghilangkan waktu proses asimtotik Dijkstra melebihi kemungkinan jika Anda terus melakukan antrean dan antrean.
Selain poin ini, beberapa algoritma yang lebih maju, seperti Algoritma Jalur Terpendek Gabow, menggunakan algoritma Dijkstra sebagai subrutin dan sangat bergantung pada implementasi kunci penurunan. Mereka menggunakan fakta bahwa jika Anda mengetahui kisaran jarak yang valid sebelumnya, Anda dapat membangun antrian prioritas super efisien berdasarkan fakta tersebut.
Semoga ini membantu!