Dijkstra’s algorithm finds the shortest paths from a given node to all other nodes in a graph
- Initially,
Mark the given node as known (path length is zero)For each out-edge, set the distance in each neighboring node equal to the cost (length) of the out-edge, and set its predecessor to the initially given node - Repeatedly (until all nodes are known),
Find an unknown node containing the smallest distance
Mark the new node as known
For each node adjacent to the new node, examine its neighbors to see whether their estimated distance can be reduced (distance to known node plus cost of out-edge)
If so, also reset the predecessor of the new node
Analysis of Dijkstra’s algorithm
Assume that the average out-degree of a node is some constant k
Initially,Mark the given node as known (path length is zero)
This takes O(1) (constant) time
For each out-edge, set the distance in each neighboring node equal to the cost (length) of the out-edge, and set its predecessor to the initially given node
If each node refers to a list of k adjacent node/edge pairs, this takes O(k) = O(1) time, that is, constant time
Notice that this operation takes longer if we have to extract a list of names from a hash table,
Repeatedly (until all nodes are known), (n times)
Find an unknown node containing the smallest distance
Probably the best way to do this is to put the unknown nodes into a priority queue; this takes k * O(log n) time each time a new node is marked “known” (and this happens n times)
Mark the new node as known — O(1) time
For each node adjacent to the new node, examine its neighbors to see whether their estimated distance can be reduced (distance to known node plus cost of out-edge)
If so, also reset the predecessor of the new node
There are k adjacent nodes (on average), operation requires constant time at each, therefore O(k) (constant) time
Combining all the parts, we get:
O(1) + n*(k*O(log n)+O(k)), that is, O(nk log n) time