自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

幾大最短路徑算法比較

開(kāi)發(fā) 后端 算法
用于解決最短路徑問(wèn)題的算法被稱(chēng)做“最短路徑算法”,有時(shí)被簡(jiǎn)稱(chēng)作“路徑算法”。最常用的路徑算法有:Dijkstra算法、A*算法、SPFA算法、Bellman-Ford算法和Floyd-Warshall算法,本文主要介紹其中的三種。

最短路徑問(wèn)題是圖論研究中的一個(gè)經(jīng)典算法問(wèn)題,旨在尋找圖(由結(jié)點(diǎn)和路徑組成的)中兩結(jié)點(diǎn)之間的最短路徑。

算法具體的形式包括:

確定起點(diǎn)的最短路徑問(wèn)題:即已知起始結(jié)點(diǎn),求最短路徑的問(wèn)題。

確定終點(diǎn)的最短路徑問(wèn)題:與確定起點(diǎn)的問(wèn)題相反,該問(wèn)題是已知終結(jié)結(jié)點(diǎn),求最短路徑的問(wèn)題。在無(wú)向圖中該問(wèn)題與確定起點(diǎn)的問(wèn)題完全等同,在有向圖中該問(wèn)題等同于把所有路徑方向反轉(zhuǎn)的確定起點(diǎn)的問(wèn)題。   

確定起點(diǎn)終點(diǎn)的最短路徑問(wèn)題:即已知起點(diǎn)和終點(diǎn),求兩結(jié)點(diǎn)之間的最短路徑。   

全局最短路徑問(wèn)題:求圖中所有的最短路徑。

Floyd

求多源、無(wú)負(fù)權(quán)邊的最短路。用矩陣記錄圖。時(shí)效性較差,時(shí)間復(fù)雜度O(V^3)。

Floyd-Warshall算法(Floyd-Warshall algorithm)是解決任意兩點(diǎn)間的最短路徑的一種算法,可以正確處理有向圖或負(fù)權(quán)的最短路徑問(wèn)題。

Floyd-Warshall算法的時(shí)間復(fù)雜度為O(N^3),空間復(fù)雜度為O(N^2)。

Floyd-Warshall的原理是動(dòng)態(tài)規(guī)劃:

設(shè)Di,j,k為從i到j(luò)的只以(1..k)集合中的節(jié)點(diǎn)為中間節(jié)點(diǎn)的最短路徑的長(zhǎng)度。

若最短路徑經(jīng)過(guò)點(diǎn)k,則Di,j,k = Di,k,k-1 + Dk,j,k-1;

若最短路徑不經(jīng)過(guò)點(diǎn)k,則Di,j,k = Di,j,k-1。

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

在實(shí)際算法中,為了節(jié)約空間,可以直接在原來(lái)空間上進(jìn)行迭代,這樣空間可降至二維。

Floyd-Warshall算法的描述如下:

  1. for k ← 1 to n do 
  2. for i ← 1 to n do 
  3. for j ← 1 to n do 
  4. if (Di,k + Dk,j < Di,j) then  
  5. Di,j ← Di,k + Dk,j; 

其中Di,j表示由點(diǎn)i到點(diǎn)j的代價(jià),當(dāng)Di,j為 ∞ 表示兩點(diǎn)之間沒(méi)有任何連接。

Dijkstra

求單源、無(wú)負(fù)權(quán)的最短路。時(shí)效性較好,時(shí)間復(fù)雜度為O(V*V+E)。

源點(diǎn)可達(dá)的話(huà),O(V*lgV+E*lgV)=>O(E*lgV)。

當(dāng)是稀疏圖的情況時(shí),此時(shí)E=V*V/lgV,所以算法的時(shí)間復(fù)雜度可為O(V^2) 。若是斐波那契堆作優(yōu)先隊(duì)列的話(huà),算法時(shí)間復(fù)雜度,則為O(V*lgV + E)。

Bellman-Ford

求單源最短路,可以判斷有無(wú)負(fù)權(quán)回路(若有,則不存在最短路),時(shí)效性較好,時(shí)間復(fù)雜度O(VE)。

Bellman-Ford算法是求解單源最短路徑問(wèn)題的一種算法。

單源點(diǎn)的最短路徑問(wèn)題是指:給定一個(gè)加權(quán)有向圖G和源點(diǎn)s,對(duì)于圖G中的任意一點(diǎn)v,求從s到v的最短路徑。

與Dijkstra算法不同的是,在Bellman-Ford算法中,邊的權(quán)值可以為負(fù)數(shù)。設(shè)想從我們可以從圖中找到一個(gè)環(huán)路(即從v出發(fā),經(jīng)過(guò)若干個(gè)點(diǎn)之后又回到v)且這個(gè)環(huán)路中所有邊的權(quán)值之和為負(fù)。那么通過(guò)這個(gè)環(huán)路,環(huán)路中任意兩點(diǎn)的最短路徑就可以無(wú)窮小下去。如果不處理這個(gè)負(fù)環(huán)路,程序就會(huì)永遠(yuǎn)運(yùn)行下去。 而B(niǎo)ellman-Ford算法具有分辨這種負(fù)環(huán)路的能力。

SPFA

是Bellman-Ford的隊(duì)列優(yōu)化,時(shí)效性相對(duì)好,時(shí)間復(fù)雜度O(kE)。(k<<V)。

與Bellman-ford算法類(lèi)似,SPFA算法采用一系列的松弛操作以得到從某一個(gè)節(jié)點(diǎn)出發(fā)到達(dá)圖中其它所有節(jié)點(diǎn)的最短路徑。所不同的是,SPFA算法通過(guò)維護(hù)一個(gè)隊(duì)列,使得一個(gè)節(jié)點(diǎn)的當(dāng)前最短路徑被更新之后沒(méi)有必要立刻去更新其他的節(jié)點(diǎn),從而大大減少了重復(fù)的操作次數(shù)。

SPFA算法可以用于存在負(fù)數(shù)邊權(quán)的圖,這與dijkstra算法是不同的。

與Dijkstra算法與Bellman-ford算法都不同,SPFA的算法時(shí)間效率是不穩(wěn)定的,即它對(duì)于不同的圖所需要的時(shí)間有很大的差別。

在最好情形下,每一個(gè)節(jié)點(diǎn)都只入隊(duì)一次,則算法實(shí)際上變?yōu)閺V度優(yōu)先遍歷,其時(shí)間復(fù)雜度僅為O(E)。另一方面,存在這樣的例子,使得每一個(gè)節(jié)點(diǎn)都被入隊(duì)(V-1)次,此時(shí)算法退化為Bellman-ford算法,其時(shí)間復(fù)雜度為O(VE)。

SPFA算法在負(fù)邊權(quán)圖上可以完全取代Bellman-ford算法,另外在稀疏圖中也表現(xiàn)良好。但是在非負(fù)邊權(quán)圖中,為了避免最壞情況的出現(xiàn),通常使用效率更加穩(wěn)定的Dijkstra算法,以及它的使用堆優(yōu)化的版本。通常的SPFA算法在一類(lèi)網(wǎng)格圖中的表現(xiàn)不盡如人意。

【編輯推薦】

  1. 階乘相關(guān)的算法及其C++實(shí)現(xiàn)
  2. “用空間換時(shí)間”的算法 帶你走進(jìn)緩存世界
  3. java算法之字符組合排序
  4. 當(dāng)今世界最受人們重視的十大經(jīng)典算法
責(zé)任編輯:于鐵 來(lái)源: IT人家
相關(guān)推薦

2013-04-23 09:31:52

SQL Server

2011-12-19 12:39:37

Java

2021-05-10 08:07:40

圖算法路徑頂點(diǎn)

2021-03-10 09:50:15

算法Dijkstra短路問(wèn)題

2024-05-24 08:00:00

2015-07-16 14:25:56

SDN網(wǎng)絡(luò)感知服務(wù)

2011-06-01 09:27:00

OSPF路由路由器

2021-08-26 17:36:42

Floyd算法數(shù)據(jù)結(jié)構(gòu)

2024-04-02 11:37:59

AGI網(wǎng)絡(luò)模型GAN

2015-12-07 17:07:36

SDN網(wǎng)絡(luò)流量

2021-09-08 10:32:29

微服務(wù)容器化Serverless

2014-03-26 09:04:42

算法Floyd最短算法

2011-05-17 14:29:29

Dijkstra

2011-05-17 14:11:06

Dijkstra

2011-04-11 16:32:28

路徑C++

2020-04-22 11:19:07

貪心算法動(dòng)態(tài)規(guī)劃

2022-11-28 10:14:16

研究算法

2019-04-01 06:54:10

2021-06-10 11:24:39

云原生ARMS

2013-06-24 09:37:34

OSPF協(xié)議SPF算法路由技術(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)