Dijkstra 狄克斯特拉 演算法

2021-09-27 08:03:52 字數 2804 閱讀 4816

該演算法是一種計算有向無環圖最短路徑的演算法。

加權圖

其中每個數字表示時間。要計算非加權圖中的最短路徑,可使用廣度優先搜尋。要計算加權圖中的最短路徑,可使用狄克斯特拉演算法。

演算法步驟

狄克斯特拉演算法包含4個步驟。

(1) 找出最便宜的節點,即可在最短時間內前往的節點。

(2) 對於該節點的鄰居,檢查是否有前往它們的更短路徑,如果有,就更新其開銷。

(3) 重複這個過程,直到對圖中的每個節點都這樣做了。

(4) 計算最終路徑。

演算法實現:

思路草稿圖:

資料結構圖:

**實現:

#第乙個雜湊表記錄圖結構:記錄了每個節點的鄰居和前往鄰居的開銷。f代表終點,s代表起點

graph =

graph[

's']

=graph[

's']

['a']=

5graph[

's']

['b']=

2graph[

'a']

=graph[

'a']

['c']=

4graph[

'a']

['d']=

2graph[

'b']

=graph[

'b']

['a']=

8graph[

'b']

['d']=

7graph[

'c']

=graph[

'c']

['d']=

6graph[

'c']

['f']=

3graph[

'd']

=graph[

'd']

['f']=

1graph[

'f']

=#第二個雜湊表:記錄從起點到每個節點的開銷.無法確定的計作無窮大

infinit =

float

('inf'

)costs =

costs[

'a']=5

costs[

'b']=2

costs[

'c']

=infinit

costs[

'd']

=infinit

costs[

'f']

=infinit

#第三個雜湊表用於記錄 每個節點的父節點

parents =

parents[

'a']

='s'

parents[

'b']

='s'

parents[

'f']

=none

#計算時,將不斷更新 costs和parents雜湊表 ,並將處理過的節點記錄在該陣列

processed =

#查詢當前離起點最近的乙個未處理的節點

deffind_lowerest_node

(costs)

: lowerst_cost =

float

('inf'

) lowerst_cost_node =

none

for node in costs:

if costs[node]

< lowerst_cost and node not

in processed:

lowerst_cost = costs[node]

lowerst_cost_node = node

return lowerst_cost_node

node = find_lowerest_node(costs)

#只要還有未處理的節點,就迴圈處理

while node is

notnone

: cost = costs[node]

#對於該節點的鄰居,檢查是否有前往它們的更短路徑,如果有,就更新其開銷。並更新父節點為該節點。

neighbors = graph[node]

for n in neighbors:

new_costs = cost + neighbors[n]

if new_costs < costs[n]

: costs[n]

= new_costs

parents[n]

= node

node = find_lowerest_node(costs)

print

(costs)

適用場景:

要計算非加權圖中的最短路徑,可使用廣度優先搜尋。要計算加權圖中的最短路徑,可使用狄克斯特拉演算法。圖還可能有環,而環類似右面這樣。該演算法並不能處理有環圖。

負權邊負權邊是指加權為負數,這樣可能會導致狄克斯特拉演算法失效。因此,不能將狄克斯特拉演算法用於包含負權邊的圖。在包含負權邊的圖中,要找出最短路徑,可使用另一種演算法——貝爾曼-福德演算法(bellman-ford algorithm)。

狄克斯特拉演算法

廣度優先演算法,它找出的是段數最少的路徑 無向圖 如果我們要找出最快的路徑 加權圖 可以使用狄克斯特拉演算法。狄克斯特拉演算法包含四個步驟 1.找出 最便宜 的節點,即可在最短時間內到達的節點 2.更新該節點的鄰居的開銷 3.重複這個過程,直到對圖中的每個節點都這樣做了 4.計算最終路徑 以下圖為例...

狄克斯特拉演算法

是由荷蘭計算機科學家狄克斯特拉於1959 年提出的。是從乙個頂點到其餘各頂點的最短路徑演算法,解決的是有向無環圖中最短路徑問題,且不能有負權邊。狄克斯特拉演算法主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。示例 找出從起點到終點的最短路徑 當前起點到各點的花費,選擇最小且沒有被檢...

(原創)狄克斯特拉演算法

1.廣度優先搜尋用於計算非加權圖中的最短路徑 2.狄克斯特拉演算法用於計算加權圖中的最短路徑 不能帶有負權邊 備註 當圖的每條邊都帶有乙個數字時,這些數字成為權重。帶權重的圖稱為加權圖,反之稱為非加權圖。1.從起點開始。2.找到該點最便宜的鄰居節點。3.若該節點的開銷優於之前記錄的開銷,則更新該節點...