Se i pesi dei bordi sono numeri interi in , è possibile implementare Dijkstra's per l'esecuzione nel tempo , seguendo il suggerimento di @ rrenaud. Ecco una spiegazione più esplicita.O ( K | V | + | E | ){0,1,…,K}O(K|V|+|E|)
In qualsiasi momento, le chiavi (finite) nella coda di priorità sono in un intervallo , dove è il valore dell'ultima chiave rimossa dalla coda di priorità. (Ogni chiave è almeno , perché la sequenza di chiavi rimossa dall'algoritmo di Dijkstra non è decrescente, e ogni chiave è al massimo , perché ogni chiave ha valore per alcuni bordo dove è la distanza dalla sorgente a un vertice che è già stato rimosso, quindi )D D D + K d [ u ] + w t ( u , w ) ( u , w ) d [ u ] u d [ u ] ≤ D{D,D+1,…,D+K}DDD+Kd[u]+wt(u,w)(u,w)d[u]ud[u]≤D
Per questo , è possibile implementare la coda di priorità con un array circolare di dimensioni , con ogni cella contenente un bucket. Memorizza ciascun vertice con la chiave nel bucket nella cella dove . Tenere traccia di . Eseguire le operazioni come segue:K + 1 k A [ h ( k ) ]A[0..K]K+1kA[h(k)]h(k)=kmod(K+1)D
delete-min : Mentre è vuoto, incremento . Quindi eliminare e restituire un vertice da .A[h(D)]DA[h(D)]
inserisci con chiave : aggiungi il vertice al bucket di .kA[h(k)]
tasto di riduzione da a : sposta il vertice da a .kk′A[h(k)]A[h(k′)]
I tasti Inserisci e Diminuisci sono operazioni a tempo costante, quindi il tempo totale impiegato in tali operazioni sarà . Il tempo totale trascorso in delete-min sarà più il valore finale della . Il valore finale di è il massimo (finito) la distanza dalla sorgente di qualsiasi vertice (perché un delete-min che prende iterazioni aumenti da ). La distanza massima è al massimo perché ogni percorso ha al massimo spigoli. Pertanto, il tempo totale impiegato dall'algoritmo è .O(|V|+|E|)O(|V|)DDiDiK(|V|−1)|V|−1O(K|V|+|E|)