Wenn Kantengewichte Ganzzahlen in , können Sie Dijkstra so implementieren, dass sie in O ( K | V | + | E | ) Zeit ausgeführt werden, gemäß dem Vorschlag von @ rrenaud. Hier ist eine explizitere Erklärung.{ 0 , 1 , … , K.}}O ( K.| V.| + | E.| )
Zu jedem Zeitpunkt befinden sich die (endlichen) Schlüssel in der Prioritätswarteschlange in einem Bereich , wobei D der Wert des letzten aus der Prioritätswarteschlange entfernten Schlüssels ist. (Jeder Schlüssel ist mindestens D , da die durch den Dijkstra-Algorithmus entfernte Tastenfolge nicht abnimmt und jeder Schlüssel höchstens D + K ist , da jeder Schlüssel den Wert d [ u ] + w t ( u , w ) für hat eine Kante ( u ,{ D , D + 1 , … , D + K.}}D.D.D + K.d[ u ] + w t ( u , w ) wobei d [ u ] der Abstand von der Quelle zu einembereits entferntenScheitelpunkt u ist, also d [ u ] ≤ D. )( u , w )d[ u ]ud[u]≤D
Aus diesem Grund können Sie die Prioritätswarteschlange mit einem kreisförmigen Array der Größe K + 1 implementieren , wobei jede Zelle einen Bucket enthält. Speichern Sie jeden Scheitelpunkt mit dem Schlüssel k im Bucket in Zelle A [ h ( k ) ], wobei h ( k ) = k mod ( K + 1 ) . Behalten Sie den Überblick von D . Führen Sie die folgenden Schritte aus:A[0..K]K+1kA[h(k)]h(k)=kmod(K+1)D
delete-min : Während ist leer, Inkrement D . Löschen Sie dann einen Scheitelpunkt aus A [ h ( D ) ] und geben Sie ihn zurück .A[h(D)]DA[h(D)]
Einfügen mit Schlüssel : Fügen Sie den Scheitelpunkt zum Eimer von A [ h ( k ) ] hinzu .kA[h(k)]
Verkleinerungsschlüssel auf k ' : Verschieben Sie den Scheitelpunkt von A [ h ( k ) ] nach A [ h ( k ' ) ] .kk′A[h(k)]A[h(k′)]
Einfügen und Verringern sind Operationen mit konstanter Zeit, daher beträgt die Gesamtzeit, die für diese Operationen aufgewendet wird, . Die Gesamtzeit im Lösch-min wird O ( | V | ) und der Endwert D . Der Endwert von D ist der maximale (endliche) Abstand von der Quelle zu einem beliebigen Scheitelpunkt (weil eine Löschmin, die i Iterationen benötigt, D um i erhöht ). Der maximale Abstand beträgt höchstens K ( | V | - 1O(|V|+|E|)O(|V|)DDiDi weil jeder Pfad höchstens | hat V | - 1 Kanten. Somit beträgt die Gesamtzeit, die der Algorithmus benötigt, O ( K | V | + | E | ) .K(|V|−1)|V|−1O(K|V|+|E|)