HOME 首页
SERVICE 服务产品
XINMEITI 新媒体代运营
CASE 服务案例
NEWS 热点资讯
ABOUT 关于我们
CONTACT 联系我们
创意岭
让品牌有温度、有情感
专注品牌策划15年

    图最短路径算法

    发布时间:2023-04-07 19:12:15     稿源: 创意岭    阅读: 67        

    大家好!今天让创意岭的小编来大家介绍下关于图最短路径算法的问题,以下是小编对此问题的归纳整理,让我们一起来看看吧。

    开始之前先推荐一个非常厉害的Ai人工智能工具,一键生成原创文章、方案、文案、工作计划、工作报告、论文、代码、作文、做题和对话答疑等等

    只需要输入关键词,就能返回你想要的内容,越精准,写出的就越详细,有微信小程序端、在线网页版、PC客户端

    官网:https://ai.de1919.com

    创意岭作为行业内优秀的企业,服务客户遍布全球各地,如需了解SEO相关业务请拨打电话175-8598-2043,或添加微信:1454722008

    本文目录:

    图最短路径算法

    一、求解:图论中常见的最短路径算法有几种?都是什么?

    算法 Algorithm

    算法是在有限步骤内求解某一问题所使用的一组定义明确的规则。通俗点说,就是计算机解题的过程。在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法。前者是推理实现的算法,后者是操作实现的算法。

    一个算法应该具有以下五个重要的特征:

    1、有穷性: 一个算法必须保证执行有限步之后结束;

    2、确切性: 算法的每一步骤必须有确切的定义;

    3、输入:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定除了初始条件;

    4、输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;

    5、可行性: 算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。

    算法的设计要求

    1)正确性(Correctness)

    有4个层次:

    A.程序不含语法错误;

    B.程序对几组输入数据能够得出满足规格要求的结果;

    C.程序对精心选择的、典型的、苛刻的、带有刁难性的几组输入数据能够得出满足规格要求的结果;

    D.程序对一切合法的输入数据都能产生满足规格要求的结果。

    2)可读性(Readability)

    算法的第一目的是为了阅读和交流;

    可读性有助于对算法的理解;

    可读性有助于对算法的调试和修改。

    3)高效率与低存储量

    处理速度快;存储容量小

    时间和空间是矛盾的、实际问题的求解往往是求得时间和空间的统一、折中。

    算法的描述 算法的描述方式(常用的)

    算法描述 自然语言

    流程图 特定的表示算法的图形符号

    伪语言 包括程序设计语言的三大基本结构及自然语言的一种语言

    类语言 类似高级语言的语言,例如,类PASCAL、类C语言。

    算法的评价 算法评价的标准:时间复杂度和空间复杂度。

    1)时间复杂度 指在计算机上运行该算法所花费的时间。用“O(数量级)”来表示,称为“阶”。

    常见的时间复杂度有: O(1)常数阶;O(logn)对数阶;O(n)线性阶;O(n^2)平方阶

    2)空间复杂度 指算法在计算机上运行所占用的存储空间。度量同时间复杂度。

    时间复杂度举例

    (a) X:=X+1 ; O(1)

    (b) FOR I:=1 TO n DO

    X:= X+1; O(n)

    (c) FOR I:= 1 TO n DO

    FOR J:= 1 TO n DO

    X:= X+1; O(n^2)

    “算法”一词最早来自公元 9世纪 波斯数学家比阿勒·霍瓦里松的一本影响深远的著作《代数对话录》。20世纪的 英国 数学家 图灵 提出了著名的图灵论点,并抽象出了一台机器,这台机器被我们称之为 图灵机 。图灵的思想对算法的发展起到了重要的作用。

    算法是 计算机 处理信息的本质,因为 计算机程序 本质上是一个算法,告诉计算机确切的步骤来执行一个指定的任务,如计算职工的薪水或打印学生的成绩单。 一般地,当算法在处理信息时,数据会从输入设备读取,写入输出设备,可能保存起来以供以后使用。

    这是算法的一个简单的例子。

    我们有一串随机数列。我们的目的是找到这个数列中最大的数。如果将数列中的每一个数字看成是一颗豆子的大小 可以将下面的算法形象地称为“捡豆子”:

    首先将第一颗豆子(数列中的第一个数字)放入口袋中。

    从第二颗豆子开始检查,直到最后一颗豆子。如果正在检查的豆子比口袋中的还大,则将它捡起放入口袋中,同时丢掉原先的豆子。 最后口袋中的豆子就是所有的豆子中最大的一颗。

    下面是一个形式算法,用近似于 编程语言 的 伪代码 表示

    给定:一个数列“list",以及数列的长度"length(list)" largest = list[1] for counter = 2 to length(list): if list[counter] > largest: largest = list[counter] print largest

    符号说明:

    = 用于表示赋值。即:右边的值被赋予给左边的变量。

    List[counter] 用于表示数列中的第 counter 项。例如:如果 counter 的值是5,那么 List[counter] 表示数列中的第5项。

    <= 用于表示“小于或等于”。

    算法的分类

    (一)基本算法 :

    1.枚举

    2.搜索:

    深度优先搜索

    广度优先搜索

    启发式搜索

    遗传算法

    (二)数据结构的算法

    (三)数论与代数算法

    (四)计算几何的算法:求凸包

    (五)图论 算法:

    1.哈夫曼编码

    2.树的遍历

    3.最短路径 算法

    4.最小生成树 算法

    5.最小树形图

    6.网络流 算法

    7.匹配算法

    (六)动态规划

    (七)其他:

    1.数值分析

    2.加密算法

    3.排序 算法

    4.检索算法

    5.随机化算法

    二、图文解析 | Dijkstra单源最短路径算法

    给定 加权有向图 G=(V,E,W),每条边的权值w为 非负数 ,表示两个顶点间的距离。

    源点s∈V。

    求:从s出发到其他各个顶点的最短路径。

    如上图所示,以1为源点,计算到其余各个顶点的最短距离(我已用红线标出)。下面列出了最终解:

    S集合 :当从s到x(x ∈V )的最短路径找到时,则x ∈S。当所有顶点都进入S集合时,算法结束。

    初始:S={s},当S=V时算法结束。

    从s到u相对于S的最短路径 :指从s到u且仅经过S中顶点的最短路径。

    dist[u]:从s到u相对于S的最短路径长度

    short[u]:从s到u最短路径的长度(算法最终解)

    dist[u] ≥ short[u]

    Dijkstra算法采用贪心算法模式,算法过程就是通过计算dist[u],不断扩充S集合,同时dist[u]会不断优化改善,直到dist[u] = short[u],并将其放到S中,当所有顶点都放入S集合时,算法结束。

    输入:加权有向图G=(V,E,W)

              V={1,2,…,n}, s=1

    输出:从s到每个顶点的最短路径

    输入:G=(V,E,W),源点1

              V={1,2,3,4,5,6}

    初始S集合只有1,计算直接从1能到达的顶点的距离,其他不能从1号顶点直接到达的顶点都记为无穷大。此时从dist[u]里找出最短距离的顶点(6号),并将其放进S集合。

      S={1}

      dist[1] = 0

      dist[2] = 10

      dist[6 ] = 3

      dist[3] = ∞

      dist[4] = ∞

      dist[5] = ∞

    当把6号顶点放进S集合后,经由6号顶点出发到达的顶点的最短距离可能会被优化更新,因为该算法的思想很“贪心”,谁更短我要谁!比如1->6->2要比1->2距离更短,所以dist[2]被更新为5,从专业术语上讲,这个“更新”过程叫做松弛,其他点同理。然后从dist[u]里找出最短的路径的那个顶点(5号),并放进S集合里。

      S={1,6}

      dist[1] = 0

     dist[6] = 3

      dist[2] = 5

      dist[4] = 9

      dist[5] = 4

      dist[3] = ∞

    后面的操作步骤其实就是重复上面的操作。即当S集合里有个新的顶点后,就可能会更新其他点的最短距离,更新一遍后,找出当前最短距离的dist[u],并将该顶点放进S集合。后面不重复阐述。

      S={1,6,5}

      dist[1] = 0

     dist[6] = 3

      dist[5] = 4

      dist[2] = 5

      dist[4] = 9

      dist[3] = ∞

      S={1,6,5,2}

      dist[1] = 0

     dist[6] = 3

      dist[5] = 4

     dist[2] = 5

      dist[4] = 9

      dist[3] = 12

      S={1,6,5,2,4}

      dist[1] = 0

     dist[6] = 3

      dist[5] = 4

     dist[2] = 5

     dist[4] = 9

      dist[3] = 12

      S={1,6,5,2,4,3}

      dist[1] = 0

     dist[6] = 3

      dist[5] = 4

     dist[2] = 5

     dist[4] = 9

     dist[3] = 12

    当有向图中的所有顶点都进入了S集合后,算法结束,此时的dist[u]的值其实就是最初我们找出的那个最终解short[u],所以,算法结束时,dist[u]=short[u],得到最终解。

    三、dijkstra算法是什么?

    迪杰斯特拉算法用来解决从顶点v0出发到其余顶点的最短路径,该算法按照最短路径长度递增的顺序产生所以最短路径。

    对于图G=(V,E),将图中的顶点分成两组:第一组S:已求出的最短路径的终点集合(开始为{v0})。第二组V-S:尚未求出最短路径的终点集合(开始为V-{v0}的全部结点)。

    图最短路径算法

    堆优化

    思考

    该算法复杂度为n^2,我们可以发现,如果边数远小于n^2,对此可以考虑用堆这种数据结构进行优化,取出最短路径的复杂度降为O(1);每次调整的复杂度降为O(elogn);e为该点的边数,所以复杂度降为O((m+n)logn)。

    实现

    1、将源点加入堆,并调整堆。

    2、选出堆顶元素u(即代价最小的元素),从堆中删除,并对堆进行调整。

    3、处理与u相邻的,未被访问过的,满足三角不等式的顶点

    1):若该点在堆里,更新距离,并调整该元素在堆中的位置。

    2):若该点不在堆里,加入堆,更新堆。

    4、若取到的u为终点,结束算法;否则重复步骤2、3。

    四、计算机网络的最短路径算法有哪些?对应哪些协议?

    用于解决最短路径问题的算法被称做“最短路径算法”,有时被简称作“路径算法”。最常用的路径算法有:

    Dijkstra算法、A*算法、SPFA算法、Bellman-Ford算法和Floyd-Warshall算法,本文主要介绍其中的三种。

    最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。

    算法具体的形式包括:

    确定起点的最短路径问题:即已知起始结点,求最短路径的问题。

    确定终点的最短路径问题:与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。

    确定起点终点的最短路径问题:即已知起点和终点,求两结点之间的最短路径。

    全局最短路径问题:求图中所有的最短路径。

    Floyd

    求多源、无负权边的最短路。用矩阵记录图。时效性较差,时间复杂度O(V^3)。

    Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题。

    Floyd-Warshall算法的时间复杂度为O(N^3),空间复杂度为O(N^2)。

    Floyd-Warshall的原理是动态规划:

    设Di,j,k为从i到j的只以(1..k)集合中的节点为中间节点的最短路径的长度。

    若最短路径经过点k,则Di,j,k = Di,k,k-1 + Dk,j,k-1;

    若最短路径不经过点k,则Di,j,k = Di,j,k-1。

    因此,Di,j,k = min(Di,k,k-1 + Dk,j,k-1 , Di,j,k-1)。

    在实际算法中,为了节约空间,可以直接在原来空间上进行迭代,这样空间可降至二维。

    Floyd-Warshall算法的描述如下:

    for k ← 1 to n do

    for i ← 1 to n do

    for j ← 1 to n do

    if (Di,k + Dk,j < Di,j) then

    Di,j ← Di,k + Dk,j;

    其中Di,j表示由点i到点j的代价,当Di,j为 ∞ 表示两点之间没有任何连接。

    Dijkstra

    求单源、无负权的最短路。时效性较好,时间复杂度为O(V*V+E),可以用优先队列进行优化,优化后时间复杂度变为0(v*lgn)。

    源点可达的话,O(V*lgV+E*lgV)=>O(E*lgV)。

    当是稀疏图的情况时,此时E=V*V/lgV,所以算法的时间复杂度可为O(V^2) 。可以用优先队列进行优化,优化后时间复杂度变为0(v*lgn)。

    Bellman-Ford

    求单源最短路,可以判断有无负权回路(若有,则不存在最短路),时效性较好,时间复杂度O(VE)。

    Bellman-Ford算法是求解单源最短路径问题的一种算法。

    单源点的最短路径问题是指:给定一个加权有向图G和源点s,对于图G中的任意一点v,求从s到v的最短路径。

    与Dijkstra算法不同的是,在Bellman-Ford算法中,边的权值可以为负数。设想从我们可以从图中找到一个环

    路(即从v出发,经过若干个点之后又回到v)且这个环路中所有边的权值之和为负。那么通过这个环路,环路中任意两点的最短路径就可以无穷小下去。如果不处理这个负环路,程序就会永远运行下去。 而Bellman-Ford算法具有分辨这种负环路的能力。

    SPFA

    是Bellman-Ford的队列优化,时效性相对好,时间复杂度O(kE)。(k< 与Bellman-ford算法类似,SPFA算法采用一系列的松弛操作以得到从某一个节点出发到达图中其它所有节点的最短路径。所不同的是,SPFA算法通过维护一个队列,使得一个节点的当前最短路径被更新之后没有必要立刻去更新其他的节点,从而大大减少了重复的操作次数。

    SPFA算法可以用于存在负数边权的图,这与dijkstra算法是不同的。

    与Dijkstra算法与Bellman-ford算法都不同,SPFA的算法时间效率是不稳定的,即它对于不同的图所需要的时间有很大的差别。

    在最好情形下,每一个节点都只入队一次,则算法实际上变为广度优先遍历,其时间复杂度仅为O(E)。另一方面,存在这样的例子,使得每一个节点都被入队(V-1)次,此时算法退化为Bellman-ford算法,其时间复杂度为O(VE)。

    SPFA算法在负边权图上可以完全取代Bellman-ford算法,另外在稀疏图中也表现良好。但是在非负边权图中,为了避免最坏情况的出现,通常使用效率更加稳定的Dijkstra算法,以及它的使用堆优化的版本。通常的SPFA。

    以上就是关于图最短路径算法相关问题的回答。希望能帮到你,如有更多相关问题,您也可以联系我们的客服进行咨询,客服也会为您讲解更多精彩的知识和内容。


    推荐阅读:

    自驾去杭州路线图(自驾去杭州路线图最新)

    杭州城市未来规划图(杭州城市未来规划图最新)

    杭州市建材市场分布地图(杭州市建材市场分布地图最新)

    佛山品牌瓷砖排行榜(正宗佛山瓷砖有哪些品牌)

    抖音怎么查达人带货数据(抖音怎么查达人带货数据查询)