暴力枚举(BF) | 数组PQ | 堆PQ | |
Prim | |||
Dijkstra |
【看完必懂】Dijkstra算法(附案例详解) - 知乎 (zhihu.com)
Dijkstra算法不同实现的时间复杂度分析:
参考《算法设计与分析》黄宇
Dijkastra(G,s):
Initialize all vertices as UNSEEN;
Initialize Que as empty;
s.dist[]=0;//源点到自己的距离为0
foreach neighbor w of s ,do:
w.path_edge=(s,w);
//将s的所有邻居入队列
Que.Insert(w,sw.weight);
while(!Que.IsEmpty()){
//x表示优先级最高的那个顶点出队列
x=Que.Extract_Min();
x.dist[]=x.priority;//dist数组表示的是源点到x的最短路径,x的优先级
Classify x.pathEdge as Shortest-Path-Edge;
Update_Fringe(x,Que);
}
- Que.Insert() 表示进入优先队列 (入队列)
- ExtractMin() 表示从优先队列中被选出(出队列)
由于PQ的实现不同,两个函数的时间复杂度也不相同:
a.数组实现PQ:
|V|----Insert代价为O(1);
|V|----Extract_Min的代价为O(n); //需要遍历找最小
|E|----DecreaseKey()的代价也为O(1)