最短路各种算法 稠密图 稀疏图 时间分析

本文分析了不同最短路算法在稠密图和稀疏图中的表现,包括Dijkstra、Floyd、Bellman-Ford、SPFA等。在稠密图中,Dijkstra通常是最佳选择,而稀疏图中邻接表算法占据优势。堆(heap)和优先级队列(priority)结合的算法在多数情况下表现出色。对于大规模数据,Dijkstra + priority 领接表优于其他算法。文章提供了详细的时间统计数据作为参考。
摘要由CSDN通过智能技术生成

分别有下面这几种算法(heap写了好久 T T 。。)

其中未注明LIST的SPFA 和 dij 是邻接矩阵的形式。

heap是手写的堆,邻接表存图。priority指的是调用C++里的STL。

Dijkstra                     
Dijkstra_priority 
Dijkstra_List                   
Dijkstra_List_priority   
Dijkstra_heap                 
SPFA                        
SPFA_List                 
Floyd                          
Bellman


稠密图我建图是任意两点均有路径,对角线都是0。。求得的最短路所有起点都是1,终点都是n(矩阵的大小)

下面是稠密图的时间统计,因为矩阵不能开太大,所以最大开了1250*1250。除了n = 10 都是秒过就统计一次,其他均生成三次数据。

时间单位是ms。

稠密图总结:(可以是用邻接矩阵的情况)

1、如果n不大,可以用邻接矩阵的话,dijkstra是最好的选择,写起来比较快而且速度也很快。其次是SPFA,写起来比较好写。

2、floyd 这个算法,n大于300就最好不要用了,很有可能跑1秒以上了。

3、bellman-ford ,n大于200就不要用了,比floyd还耗时间 = =。。。



稀疏图的m 是边数,n是点数。

稀疏图总结:(前面的n比较小时可以用邻接矩阵,后面的floyd 啊 dijkstra等不能使用邻接矩阵的就删掉不考虑了)

1、稀疏图,明显感觉用邻接表的算法占优势了。

2、bellman 超过50000边就不要用了。

3、heap的表现可以说是最好的。

4、超过3000个点就不要用dijkstra 加邻接表 不加任何优化的那种。

5、超过500000条边就不要用SPFA加邻接表了。

6、综上,dijkstra + priority 邻接表 是最好的选择。虽然比heap慢一点,跑3W点 300W边和heap没差多少。

7、priority坏处就是,不能在队列里修改值,如果进队多次,可能空间满了。。

8、特别恶心的可以用heap ,一般的恶心用priority足以^ ^


附稠密图和稀疏图的时间统计

稠密图

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值