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

本文分析了Dijkstra和Prim算法的不同实现方式,特别是使用数组和堆实现的优先队列在时间复杂度上的区别。Dijkstra算法的堆实现为O((V+E) log V),而数组实现为O((V+E)*V)。Prim算法的堆实现为O((V+E) log V),数组实现为O(V^2)。在选择实现方式时,要考虑图的稀疏性和数据规模等因素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

暴力枚举(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)
            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值