演算法筆記7 狄克斯特拉演算法

2021-08-20 01:45:45 字數 2038 閱讀 1607

本章內容:

繼續圖的討論,介紹加權圖----提高或降低某些邊的權重

介紹狄克斯特拉演算法,能讓你找出加權圖中前往x的最短路徑

介紹圖中的環,它導致狄克斯特拉演算法不管用

廣度優先演算法指出的是段數最少的路徑。找出最快的路徑需要使用狄克斯特拉演算法。

7.1使用狄克斯特拉演算法

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

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

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

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

(4)計算最終路徑。

7.2術語

狄克斯特拉演算法用於每條邊都有關聯數字的圖,這些數字稱為權重。

帶權重的圖稱為加權圖,不帶權重的圖稱為非加權圖。

要計算非加權圖使用廣度優先演算法。計算加權圖使用狄克斯特拉演算法。圖可能存在環。

在無向圖中,每條邊都是乙個環。狄克斯特拉演算法只適用於有向無環圖。

狄克斯特拉演算法關鍵理念:找出圖中最便宜的節點,並確保沒有到該節點的更便宜的路徑。

7.4負權邊

如果圖含有負權邊(比0小的邊),就不能使用狄克斯特拉演算法。可使用貝爾曼-福德演算法計算帶有負權邊的圖。

7.5實現

graph = {}

graph['you'] = ['alice', 'bob', 'claire']

graph['start'] = {}

graph['start']['a'] = 6

graph['start']['b'] = 2

graph['a'] = {}

graph['a']['fin'] = 1

graph['b'] = {}

graph['b']['a'] = 3

graph['b']['fin'] = 5

graph['fin'] = {}

infinity = float('inf')

costs = {}

costs['a'] = 6

costs['b'] = 2

costs['fin'] = infinity

parents = {}

parents['a'] = 'start'

parents['b'] = 'start'

parents['fin'] = none

processed =

def find_lowest_cost_node(costs):

lowest_cost = float('inf')

lowest_cost_node = none

for node in costs:

cost = costs[node]

if cost < lowest_cost and node not in processed:

lowest_cost = cost

lowest_cost_node = node

return lowest_cost_node

node = find_lowest_cost_node(costs)

while node is not none:

cost = costs[node]

neighbors = graph[node]

for n in neighbors.keys():

new_cost = cost + neighbors[n]

if costs[n] > new_cost:

costs[n] = new_cost

parents[n] = node

node = find_lowest_cost_node(costs)

print "cost from the start to each node:"

print costs

7.6小結

廣度優先搜素用於在非加權圖中查詢最短路徑。

狄克斯特拉演算法用於在加權圖中查詢最短路徑。

僅當權重為正時狄克斯特拉演算法才管用。

如果圖中包含負權邊,請使用貝爾曼-福德演算法。

狄克斯特拉演算法

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

狄克斯特拉演算法

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

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

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