zoukankan      html  css  js  c++  java
  • Dijkstra算法和Floyd算法

    以下两段选自:Dijkstra算法和Floyd算法对比分析

    Dijkstra算法本质上是贪心算法,下一条路径都是由当前更短的路径派生出来的更长的路径。不存在回溯的过程。如果权值存在负数,那么被派生出来的可能是更短的路径,这就需要过程可以回溯,之前的路径需要被更短的路径替换掉,而Dijkstra算法是不能回溯的。它每一步都是以当前最优选择为前提的。所以,按照Dijkstra的算法逻辑,它是不能计算负权图的。

    Floyd算法实际上是一个动态规划算法。 每一个点对u和v之间的最短路径,可能会经过N个点,这些中间点记为k。 假定u到k之间的最短路径已经找好,k到v之间的最短路径已经找好,那么求u到v之间的最短路径,就是遍历各个可能的k点,然后求(u,k)+(k,v)之间的最小值。 所以这实际上将大规模的问题自顶向下划分为了小规模的问题,这就是动态规划思想。因为动态规划是可以回溯的,它可以计算负权图。

    ---------分割线君-----------

    Dijkstra算法和Floyd算法的区别之处:
    总结来说就是
    1.Dijkstra不能处理负权图,Flyod能处理负权图;
    2.Dijkstra处理单源最短路径,而Flyod是处理多源最短路径
    这个区别有个博主写的特别好,生动又形象,来吧!传送门:最短路径——Dijkstra算法和Floyd算法
    3.Dijkstra时间复杂度为O(n^2)

    Flyod时间复杂度为O(n^3) 空间复杂度为O(n ^ 2)

    =>题目中如果是单源点正权图,就用Dijkstra,如果是任意两个点之间的最短路径或者是负权图,就用Floyd

  • 相关阅读:
    [Windows] 重新安装/卸载桌面版OneDrive / Reinstall/ Uninstall Desktop Version OneDrive
    [Linux] 关闭防火墙以及开放端口
    [Java] Properties类
    [Linux] 文档编辑搜索
    [Dababase
    etymological
    [JavaScript] 表单验证不通过不提交的JS写法
    Lyrics来源
    [Maven
    [ Servlet / JSP ] J2EE Web Application 中的 JSESSIONID 是什么?
  • 原文地址:https://www.cnblogs.com/savennist/p/12410439.html
Copyright © 2011-2022 走看看