最短路径各种调戏
文章平均质量分 86
嬅南雨蝶
不忘初心,脚踏实地
展开
-
原生的Dijkstra
看得出来这是一个稀疏图,因此SPFA是最合适的,但是Dijkstra算法也是可以的,不过毫无优化的原生Dijkstra是会超时的,因为Dijkstra采用的是贪心策略,时间复杂度是n^n,本文只提供裸体的Dijkstra算法实现,后面会有Heap+Dijkstra堆优化的Dijkstra和PriorityQueue+Dijkstra优先队列优化的Dijkstra。原创 2015-05-10 17:01:28 · 777 阅读 · 0 评论 -
SPFA单源最短路径
SPFA(Shortest Path Faster Algorithm)是Bellman-Ford算法的一种队列实现,减少了不必要的冗余松弛操作。前面说的Dijkstra算法虽然思想简单,优化也不难,但是如果面对含有负环的图来求解的话就无能为力了。并且从另一方面讲,即使图中没有负环,由于Dijkstra算法是基于结点的,而SPFA算法是基于边数的,所以说对于结点较少而边数较多(也就是稠密图)来说,无疑PriorityQueue+Dijkstra是最好的选择;而对于结点较多边数较少(也就是稀疏图)来说无疑SP原创 2015-05-11 14:28:23 · 686 阅读 · 0 评论 -
Heap+Dijkstra堆优化的Dijkstra
前面说到“原生的Dijkstra”,由于Dijkstra采用的是贪心策略,在贪心寻找当前距离源结点最短的结点时需要遍历所有的结点,这必然会导致效率的下降,时间复杂度为n^n。因此当数据量较大时会消耗较长时间。为了提高Dijkstra的效率,只有对Dijkstra的贪心策略进行改进。 由于Dijkstra采用的贪心策略是每次寻找最短距离的结点并将其放入存放所有已知最短距离结点的S集合中,可以联想到堆以及优先级队列这些数据结构,这些结构都能非常高效地提供当前状态距离最短的结点。实践也可以证明这两种优化对于Dij原创 2015-05-11 08:19:03 · 6142 阅读 · 0 评论 -
PriorityQueue+Dijkstra优先队列优化的Dijkstra
前面分别介绍了“原生的Dijkstra”即毫无优化的Dijkstra,但这种Dijkstra的效率较低为n^n,因此面对较大数据量的时候需要对其进行优化,也就是优化所采用的贪心策略的实现,因此就有了Heao+Dijkstra堆优化的Dijkstra,但是堆优化的实现很复杂,而PriorityQueue+Dijkstra优先队列优化的Dijstra的效率虽然略低于堆优化的Dijkstra,但是实现却容易的多,也不容易出错,因为可以借助java类库中的PriorityQueue来实现,因此优先队列优化的Dijk原创 2015-05-11 09:04:21 · 8219 阅读 · 0 评论