Kenar ağırlıkları da tamsayı ise , Dijkstra'ları @ rrenaud'un önerisini izleyerek O ( K | V | + | E | ) saatinde çalıştırabilirsiniz. İşte daha açık bir açıklama.{0,1,…,K}O(K|V|+|E|)
Herhangi bir zamanda, öncelik kuyruğundaki (sonlu) tuşlar aralığındadır ; burada D , öncelik kuyruğundan kaldırılan son anahtarın değeridir. (Her anahtar en az D'dir , çünkü Dijkstra'nın algoritması tarafından kaldırılan anahtarların sırası azalmaz ve her anahtar en fazla D + K'dir , çünkü her anahtarın d [ u ] + w t ( u , w ) değeri vardır . biraz kenar ( u ,{D,D+1,…,D+K}DDD+Kd[u]+wt(u,w) burada d [ u ] kaynaktankaldırılmışolan bir tepe noktasına u mesafedir, bu nedenle d [ u ] ≤ D. )(u,w)d[u]ud[u]≤D
Bu nedenle, öncelik sırasını , her hücre bir kova içerecek şekilde K + 1 boyutunda bir dairesel dizisiyle uygulayabilirsiniz . Her tepe noktasını k tuşu ile A [ h ( k ) ] hücresindeki ; burada . takip edin . İşlemleri aşağıdaki gibi yapın:A[0..K]K+1kA[h(k)]Dh(k)=kmod(K+1)D
delete-min : boşken, . Ardından öğesinden bir tepe noktasını silin ve döndürün .D A [ h ( D ) ]A[h(D)]DA[h(D)]
tuşu ile yerleştirin : Köşeyi kepçesine ekleyin .A [ h ( k ) ]kA[h(k)]
Anahtar azaltmak için :' den tepe taşı üzere .k ′ A [ h ( k ) ] A [ h ( k ′ ) ]kk′A[h(k)]A[h(k′)]
Ekle ve azaltma tuşu sabit zamanlı işlemlerdir, bu nedenle bu işlemlerde harcanan toplam süre . Delete-min'de harcanan toplam süre artı nin son değeri olacaktır . Nihai değeri (alır silme-min, çünkü herhangi bir tepe kaynaktan maksimum (sonlu) mesafedir artar yineleme ile ). Her yol en fazla kenarına sahip olduğundan , maksimum mesafe en fazla . Böylece, algoritma tarafından harcanan toplam süre .O ( | V | ) D D i D i K ( | V | - 1 ) | V | - 1 O ( K | V | + | E | )O(|V|+|E|)O(|V|)DDiDiK(|V|−1)|V|−1O(K|V|+|E|)