I
was recently doing some reading on algorithms, as I was reading up on
Dijkstra's algorithm, I noticed that there seemed to be a lack of nice
explanations out there. I found lots of applets, and demonstrations, but
none of them had a step-by-step explanation, i.e. why certain events
were occuring. Wikipedia has an article on Dijkstra's Algorithm,
but personally, I didn't find it too clear. I decided to put up my own
effort at explaining the algorithm, if any of it is unclear, let me know
and I'll add in more detail, or a better explanation.
Dijkstra's Algorithm
Before I start into how Dijkstra's Algorithm does what it does, here is a short description of what Dijkstra's Algorithm does:
In a given graph, and starting node, Dijkstra's Algorithm discovers the shortest path from the starting node to all other nodes.
Assumptions: The cost/length of travelling between nodes is known.The Explanation: Dijkstra's Algorithm
Figure 1 displays the graph: nodes are black circles labelled a-f, a path is a black line connecting two nodes, each path has an associated length beside it (the numbers). The lengths are not to scale. Node 'a' is our starting node, we want to find the shortest path to all other nodes in the graph. To do this, we generate a table. This table has the distance to all the nodes in the graph, from the perspective of the starting node 'a'.
Node | Distance to Node from Node 'a' |
---|---|
b | INFINTE |
c | INFINTE |
d | INFINTE |
e | INFINTE |
f | INFINTE |
g | INFINTE |
h | INFINTE |
i | INFINTE |
As can be seen from Table 1, the initial entries for the distances are all set to infinity (or some notional maximum value). This ensures that any path found will be shorter than the initial value stored in the table.
The node 'a' is the starting node, as such we examine all the possible paths away from this node first. The options are as follows:
Node | Distance to Node from Node 'a' |
---|---|
b | 7 |
c | 4 |
d | 5 |
These values are used to update the graph table, Table 1, which becomes:
Node | Distance to Node from Node 'a' |
---|---|
b | 7 |
c | 4 |
d | 5 |
e | INFINTE |
f | INFINTE |
g | INFINTE |
h | INFINTE |
i | INFINTE |
Figure 2 shows the routes marked in red. We know have three paths from node 'a'. However, these paths are not yet guaranteed to be the shortest path. To be sure we have the shortest path, we have to keep going.
The next move in the algorithm is to move to the nearest node from node 'a'. In this case that is node 'c'.
At node 'c' we have paths available to nodes 'b' and 'h'. When calculating the distances we have to calculate the distances from node 'a'. In this case that means the following:
Node | Distance to Node from Node 'a' |
---|---|
b | 6 |
h | 13 |
These values are then compared to the values stored in the Table 3. It can be seen that both of these values are less than the current values stored in the table, as such table 3 becomes:
Node | Distance to Node from Node 'a' |
---|---|
b | 6 |
c | 4 |
d | 5 |
e | INFINTE |
f | INFINTE |
g | INFINTE |
h | 13 |
i | INFINTE |
This step has illustrated one of the advantages of dijkstra's algorithm: the route to node 'b' is not the most direct route, but it is the shortest route; Dijkstra's Algorithm can find the shortest route, even when that route is not the most direct route.
Again, all paths accesible from node 'c' have been checked, and the table of paths has been updated. Node 'c' is marked as visited.
IMPORTANT:
- A Visited node is never re-visited.
- Once a node has been marked visited, the path to that node is known to be the shortest route from the initial node.
Node | Distance to Node from Node 'a' | Visited |
---|---|---|
b | 6 | NO |
c | 4 | YES |
d | 5 | NO |
e | INFINTE | NO |
f | INFINTE | NO |
g | INFINTE | NO |
h | 13 | NO |
i | INFINTE | NO |
As these value are being updated, the route that accompanies these distances also needs to be stored.
Once again, the table of paths is consulted, and the shortest path to a node that has not been visited is found. This node becomes the next current node. In this case, that is node 'd'.
From node 'd', the following paths are available:
Node | Distance to Node from Node 'a' |
---|---|
f | 14 |
The table of all paths is updated to reflect that, and the node 'd' is marked as visited, this locks in the shortest path to node 'd' also:
Node | Distance to Node from Node 'a' | Visited |
---|---|---|
b | 6 | NO |
c | 4 | YES |
d | 5 | YES |
e | INFINTE | NO |
f | 14 | NO |
g | INFINTE | NO |
h | 13 | NO |
i | INFINTE | NO |
It can be seen from table 8 above, that the next nearest node to node 'a' is node 'b'. All paths from node 'b' are examined next. In this instance, we have a path to a node that is marked as visited: node 'c', we already know that the path to node 'c' is as short as it can get (the node being marked as visited is the marker for this).
As figure 6 shows, we check the path the only other node accesible from node 'b': node 'e'. This updates our paht table as follows:
Node | Distance to Node from Node 'a' | Visited |
---|---|---|
b | 6 | YES |
c | 4 | YES |
d | 5 | YES |
e | 31 | NO |
f | 14 | NO |
g | INFINTE | NO |
h | 13 | NO |
i | INFINTE | NO |
Table 9 again tells us that the next node for us to visit is node 'h'.
We add up the paths, and mark the nodes as visited...
We keep on doing this....
Until all the nodes have been visited!
That's all!!
Post comments if you have any problem...
Post A Comment: