Prim算法与Dijkstra算法(优先队列实现的时间复杂度分析)

堆实现的优先队列在维护最小值时的时间复杂度是O(logV),而数组实现的优先队列需要遍历整个数组来查找最小值,时间复杂度是O(V)因为优先队列用的就是一个堆,push和pop就是上浮和下沉,与树的高度成正比。而Dijkstrta贪心选择的是未visit结点到源的最短路径值dist[]Prim贪心选择的是未visit结点到MST那一堆里面最小的点。Prim与Dijkstra的区别就在于《贪心策略的不同》并且由于它们都是贪心的,都有算法正确性证明的板块。m=|E|,边的数量。
摘要由CSDN通过智能技术生成
暴力枚举(BF) 数组PQ 堆PQ
Prim O(|V|^{3}) O(|V|^{2}) O((|V|+|E|)*log|V|)
Dijkstra O(|V|^{2}) O((|V|+|E|)*|V|) O((|V|+|E|)*log|V|)

【看完必懂】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)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值