Dijkstra可以通过以下更改而大大加速:
通常,Dijkstra算法包含如下循环:
MyListType toDoList; // List sorted by smallest distance
InsertAllNodes(toDoList);
while(! toDoList.empty())
{
MyNodeType *node = *toDoList.first();
toDoList.erase(toDoList.first());
...
}
如果您对此稍作更改,它的工作原理相同,但效果更好:
MyListType toDoList; // List sorted by smallest distance
toDoList.insert(startNode);
while(! toDoList.empty())
{
MyNodeType *node = *toDoList.first();
toDoList.erase(toDoList.first());
for(MyNeigborType *x = node.Neigbors; x != NULL; x++)
{
...
toDoList.insert(x->Node);
}
}
看来,这种修改使运行时间减少了一个数量级,而不是一个指数级。它将我的运行时形式从30秒减少到不到2秒。在任何文献中都找不到这种修改。同样很清楚,原因在于排序列表中。插入/擦除操作会产生100.000个元素,而整手操作的效果要差得多。