floyd算法(floyd算法是动态规划吗)

今天给各位分享floyd算法的知识,其中也会对floyd算法是动态规划吗进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览: 1、弗洛伊德算法求出最短距离...

今天给各位分享floyd算法的知识,其中也会对floyd算法是动态规划吗进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

弗洛伊德算法求出最短距离

(1)利用二维数组dist[i][j]记录当前vi到vj的最短路径长度,数组dist的初值等于图的带权邻接矩阵;

(2)集合S记录当前允许的中间顶点,初值S=Φ;

(3)依次向S中加入v0 ,v1… vn-1,每加入一个顶点,对dist[i][j]进行一次修正:设S={v0 ,v1… vk-1},加入vk,则dist(k)[i][j] = min{ dist(k-1)[i][j],dist(k-1)[i][k]+dist(k-1)[k][j]}。 

dist(k)[i][j]的含义:允许中间顶点的序号最大为k时从vi到vj的最短路径长度。

dist(n-1)[i][j]就是vi到vj的最短路径长度。

弗洛伊德最短距离算法(Floyd Shortest Path Algorithm)又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。

中文名   弗洛伊德最短距离算法

外文名   FloydShortest Path Algorithm

所属学科    IT

所属领域   程序设计

简介

最短路问题是网络最优化中一个基本而又非常重要的问题,这一问题相对比较简单,在实际生产和生活中经常遇到,许多的网络最优化问题可以化为最短路问题,或者用最短路算法作为其子程序.因此,最短路的用途已远远超出其表面意义迄今为止,所有最短路算法都只对不含负回路的网络有效,实际上对含有负回路的网络,其最短路问题是NP困难的,因此本研究所讨论的网络也不含负回路.此外,如果将无向图每条边用两条端点相同、方向相反的弧来代替,可以将其化为有向图,因而不讨论无向图.本研究中未述及的术语、记号。

Floyd算法是一种用于寻找给定加权图中顶点间最短路径的算法,以1978年图灵奖获得者斯坦福大学计算机科学系教授RobertW.Floyd命名。Floyd算法采用动态规划的原理计算两两顶点间最短路径,主要解决网络路由寻找最优路径的问题。

floyd判圈算法

问题:如何检测一个链表是否有环,如果有,那么如何确定环的起点.

要求 : 空间复杂度为O(1), 时间复杂度为O(n).

假设一个有环链表如下图: 利用floyd判圈算法可以做到下面的三件事:

使用两个指针slow和fast。两个指针都从链表的起始处S开始。slow每次向后移动一步,fast每次向后移动两步。若在fast到达链表尾部前slow与fast相遇了,就说明链表有环。

这里可以简单的证明一下:反证法,假如没有环,那么slow永远追不上fast,那么在fast到达链表尾部前slow不会fast相遇了。若相遇了,链表就有环。

当slow和fast相遇时,slow和fast必定在环上,所以只要让一者不动,另一者走一圈直到相遇,走过的节点数就是环的长度。

如图所示,设AB=n, SA=m。设环的长度为L。

假设slow走过的节点数为i,那么有:

i = m + n + a L a为slow绕过的环的圈数。

因为fast速度为slow的两倍,所以相同时间走过的节点数为slow的两倍,所以有:

2 i = m + n + b L b为fast绕过的环的圈数。

两者做差有 : i = (b-a) L。

所以可知,fast和slow走过的距离是环的整数倍。

所以有m+n=L。

所以此时让slow回到起点S,,fast仍然在B。

让两个指针以每次一步的速度往前走。

当走了m步时,可发现slow和fast正好都在A处,即是环的起点。

floyd判圈算法是一个很有趣的算法,在某些题目上用处很大,比如下面这个。

给出一个数组 nums 包含 n + 1 个整数,每个整数是从 1 到 n (包括边界),保证至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。

注意事项

对于这个题目

floyd算法 是动态规划的思想吗

1.定义概览

Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。Floyd-Warshall算法的时间复杂度为O(N3),空间复杂度为O(N2)。

2.算法描述

1)算法思想原理:

Floyd算法是一个经典的动态规划算法。用通俗的语言来描述的话,首先我们的目标是寻找从点i到点j的最短路径。从动态规划的角度看问题,我们需要为这个目标重新做一个诠释(这个诠释正是动态规划最富创造力的精华所在)

从任意节点i到任意节点j的最短路径不外乎2种可能,1是直接从i到j,2是从i经过若干个节点k到j。所以,我们假设Dis(i,j)为节点u到节点v的最短路径的距离,对于每一个节点k,我们检查Dis(i,k) + Dis(k,j) Dis(i,j)是否成立,如果成立,证明从i到k再到j的路径比i直接到j的路径短,我们便设置Dis(i,j) = Dis(i,k) + Dis(k,j),这样一来,当我们遍历完所有节点k,Dis(i,j)中记录的便是i到j的最短路径的距离。

2).算法描述:

a.从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。

b.对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比己知的路径更短。如果是更新它。

3).Floyd算法过程矩阵的计算----十字交叉法

方法:两条线,从左上角开始计算一直到右下角 如下所示

给出矩阵,其中矩阵A是邻接矩阵,而矩阵Path记录u,v两点之间最短路径所必须经过的点

快慢指针解决环形链表问题(Floyd判圈算法,也叫龟兔赛跑算法)

问题:

1.给定一个链表,判断链表中是否有环。

2.给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

说明:

不允许修改给定的链表。

时间复杂度:O(n)

空间复杂度:O(1)

解决办法:

使用Floyd判圈算法,也叫龟兔赛跑算法。

原理:

设定每次兔子(快指针)跑两步,乌龟(慢指针)跑一步(这样设定是关键,也是该方法的巧妙之处),两者同时起跑。如果链表中有环,那么兔子会先进入环中,等乌龟进入环后,两者都在环内跑,所以兔子肯定会追上乌龟跟它相遇。

对于问题一,如果兔子能与乌龟相遇,就证明有环,如果兔子能跑到尽头停下来,证明没有环。

对于问题二,只要在起点再放一只一次跑一步的乌龟2号,当环内的龟兔相遇时起点的乌龟2号起跑,两只乌龟相遇的位置就是环的第一个节点。 原因 :设乌龟跟兔子在环内相遇时乌龟共跑了 x步 ,那么兔子就跑了 2x步 ,兔子比乌龟 多跑x步 ,在乌龟进入环之前,兔子已经在环内 跑了n圈+c步(c=0) ,在乌龟进入环后,当兔子比乌龟跑多了一圈的步数时就追上了乌龟或者在乌龟入环时刚好相遇,所以兔子比乌龟 总共多跑m+n圈(m等0或1) ,所以m+n圈等于x步,即 x是环的长度y的整数倍(x=ky) 。再设环的第一个节点离起点a步(a=0),相遇点离环的第一个节点b步(b=0),a+b=x=ky。当乌龟2号在起点和乌龟1号在龟兔的相遇点同时起跑时,乌龟2号走了a步,到达环的第一个节点,乌龟1号也走了a步,由于a+b是环长度的整数倍,所以乌龟1号也在环的第一个节点上,所以与乌龟2号相遇,即得到了环的第一个节点的位置。

龟兔赛跑算法的巧妙之处在于兔子是乌龟速度的两倍,才能得到乌龟步数是环长度的整数倍的关系,从而能快速找到环的第一个节点。另外,双指针还有很多用法,不同的移动速度,不同的起点都会带来奇妙的效果。

Floyd算法的算法过程

1,从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。

2,对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比已知的路径更短。如果是更新它。

把图用邻接矩阵G表示出来,如果从Vi到Vj有路可达,则G[i,j]=d,d表示该路的长度;否则G[i,j]=无穷大。定义一个矩阵D用来记录所插入点的信息,D[i,j]表示从Vi到Vj需要经过的点,初始化D[i,j]=j。把各个顶点插入图中,比较插点后的距离与原来的距离,G[i,j] = min( G[i,j], G[i,k]+G[k,j] ),如果G[i,j]的值变小,则D[i,j]=k。在G中包含有两点之间最短道路的信息,而在D中则包含了最短通路径的信息。

比如,要寻找从V5到V1的路径。根据D,假如D(5,1)=3则说明从V5到V1经过V3,路径为{V5,V3,V1},如果D(5,3)=3,说明V5与V3直接相连,如果D(3,1)=1,说明V3与V1直接相连。

上一篇:圣火徽章外传(圣火徽章外传金手指代码大全)
下一篇:私服冒险岛(冒险岛手游变态服)

为您推荐

发表评论