Dijkstra 算法

all the nodes should be carectorized into three groups: (visited, front, unknown) we should pay special attention to front group.

The Dijkstra Algorithm:

front = start node

while front is not empty:

  get node n with minimum cost in the front group, and mark it as visited

  for any direct neighbour m of n, and not in the visited group:

    add it to front group if it is not in the front group

    or update (when the new cost is lower) its cost if it is in the front group 

 

So in one loop:

1. only one node is added into visited group;

2. all the nodes directly connected with the visited group are added into front group;

3. update on some of the front nodes (connected with newly added nodes in visited), should be made.

  For 3, alternatively, we can just add the new nodes connected with the newly added visited node (not update, so may have copy of the same node in front). Then right after we add a visited node, we should "skip" the copy of this visited node in front group. 

 

To improve the algorithm's efficiency, we can implement the front group by Heap data strucutre, instead of searching the minimum element in list with O(N) for each loop.

During each loop, we first pop the minimum node from front group and set it as visited, then we push back newly added front nodes connected with this new visited node, to reach a O(logN) complexity. 

posted @ 2016-11-03 11:34  徐尚  阅读(284)  评论(0编辑  收藏  举报