Nếu trọng số cạnh là số nguyên trong , bạn có thể triển khai Dijkstra để chạy trong thời gian , theo đề xuất của @ rrenaud. Đây là một lời giải thích rõ ràng hơn.O ( K | V | + | E | ){ 0 , 1 , ... , K}Ôi ( K| V| + | E| )
Bất cứ lúc nào, các khóa (hữu hạn) trong hàng ưu tiên đều nằm trong một số phạm vi , trong đó là giá trị của khóa cuối cùng được xóa khỏi hàng ưu tiên. (Mọi khóa đều ít nhất là , bởi vì chuỗi các khóa được loại bỏ bởi thuật toán của Dijkstra là không giảm và mọi khóa đều có nhiều nhất là , bởi vì mọi khóa đều có giá trị đối với một số cạnh trong đó là khoảng cách từ nguồn đến một số đỉnh đã bị xóa, vì vậy )D D D + K d [ u ] + w t ( u , w ) ( u , w ) d [ u ] u d [ u ] ≤ D{ D , D + 1 , Nhìn , D + K}DDD + Kd[ u ] + w t ( u , w )( u , w )d[ u ]bạnd[ U ] ≤ D
Do đó, bạn có thể triển khai hàng đợi ưu tiên với một mảng tròn có kích thước , với mỗi ô chứa một thùng. Lưu trữ mỗi đỉnh với khóa trong thùng trong ô trong đó . Theo dõi các . Thực hiện các thao tác như sau:K + 1 k A [ h ( k ) ] h ( k ) = k mod ( K + 1 ) DA [ 0 .. K]K+ 1kMột [ h ( k ) ]h ( k ) = k mod ( K+ 1 )D
xóa-min : Trong khi là trống rỗng, increment . Sau đó xóa và trả về một đỉnh từ .D A [ h ( D ) ]Một [ h ( D ) ]DMột [ h ( D ) ]
chèn bằng khóa : Thêm đỉnh vào nhóm của .A [ h ( k ) ]kMột [ h ( k ) ]
phím giảm đến : Di chuyển đỉnh từ sang .k ′ A [ h ( k ) ] A [ h ( k ′ ) ]kk'Một [ h ( k ) ]Một [ h ( k') ]
Phím chèn và phím giảm là các thao tác thời gian không đổi, vì vậy tổng thời gian dành cho các thao tác đó sẽ là . Tổng thời gian dành cho delete-min sẽ cộng với giá trị cuối cùng của . Giá trị cuối cùng của là khoảng cách tối đa (hữu hạn) từ nguồn tới bất kỳ đỉnh nào (vì một lần xóa có lần lặp tăng lên ). Khoảng cách tối đa nhiều nhất là vì mỗi đường dẫn có nhiều nhất cạnh. Do đó, tổng thời gian dành cho thuật toán là .O ( | V | ) D D i D i K ( | V | - 1 ) | V | - 1 O ( K | V | + | E | )Ô ( | V| + | E| )Ô ( | V| )DDiDiK(|V|−1)|V|−1O(K|V|+|E|)