<演算法圖鑑>心得筆記-第四章

IgorChien
6 min readSep 10, 2020

--

前言

閱讀學習後紀錄下來,以增加自己的記憶及分享學習心得。

何謂圖形

提到「圖形」(Graph),多數人會聯想到圓餅圖、長條圖,但計算機科學或離散數學所用的圖形,如下圖

圓點稱為「頂點」(有時候也稱「節點」)。連接頂點和頂點的線稱為「邊」。所以圖形呈現會有數個頂點,並用邊連接成對頂點。

Graph

常見的圖形:

・加權圖形
如下圖,每個邊上都有數字,稱為邊的「加權」或「權重」,這類圖形稱為「加權圖形」(Weighted Graph)。

Weighted Graph

・有向圖
如下圖,在圖形中表示某個邊只能單向通行,並在邊上端點加註方向,這類的圖形稱為「有向圖」(Directed Graph)。反之,邊不設方向的圖形,稱為「無向圖」(Undirected Graph)。

Directed Graph
補充:使用圖形可以用來解決各式各樣的問題,例如找出計算機網路中通訊時間最短的路徑,鐵路路線中移動時間最短的路徑或是花費最便宜的路徑等。

廣度優先搜尋

圖形搜尋的演算法之一。目的是從起點經由邊搜尋頂點,直到找到指定的頂點(目標頂點),搜尋時優先搜尋離起點較近的頂點。抵達節點時可以判定此頂點是否為目標頂點。

Breadth-First Search
補充:頂點是用「先進先出」(FIFO)的方式管理,所以可以用「佇列」的資料結構。具有從靠近起點的頂點開始廣泛搜尋的特徵,所以目標頂點離起點很近時,搜尋結果很快。

深度優先搜尋

圖形搜尋的演算法之一。目的同樣是從起點經由邊搜尋頂點,直到找到指定的頂點(目標頂點),在搜尋時,先搜尋單一路徑,直到無法繼續前進,再折返搜尋下一條路徑。

Depth-First Search
補充:頂點是用「後進先出」(LIFO)的方式管理,所以可以用「堆疊」的資料結構。具有深入單一路徑往下探查的特徵,與廣度優先搜尋的搜尋順序大不相同。

貝爾曼-福特演算法

計算圖形最短路徑問題的演算法。最短路徑問題在賦予邊權重的「加權圖形」裡,指定「起點」和「終點」,求出從起點到終點之間,邊權重總和最小的路徑。

Bellman-Ford Algorithm
補充:求最短路徑時,通常邊的權重用來表示時間、距離或費用等數據,通常都不是負數。但使用貝爾曼-福特演算法時,就算權重是負數也能正確運作。當圖形有迴圈且迴圈各邊權重總和為負數時,隨著不斷重複迴圈,路徑的權重越變越小,就算對頂點進行n循環得更新操作,依舊能更新頂點的權重,就可以判斷為「最短路徑不存在」。使用貝爾曼-福特演算法的執行時間假設輸入圖形的頂點數為n、邊的數目為m,演算法進行n次更新操作的循環後就會停止,而在每次的循環會檢視所有的邊一次,所以一次循環的執行時間是 O(m),整體時間就是 O(nm)。

戴克斯特拉演算法

計算圖形最短路徑問題的演算法。同貝爾曼-福特演算法,都是用以解決最短路徑問題,求出從起點到終點之間,邊權重總和最小的路徑。

Dijkstra’s Algorithm
補充:求取最短路徑時,當圖形內容包含負的權重時,使用戴克斯特拉演算法,有時候會無法正確求出最短路徑。因而戴克斯特拉演算法不適用於有負權重的圖形。戴克斯特拉演算法,著重於選擇頂點,進而有效率的求出最短路徑。
貝爾曼-福特演算法,著重對所有的邊進行權重計算和更新。
使用戴克斯特拉演算法的執行時間假設輸入圖形的頂點數為n、邊的數目為m,在沒有仔細研究選好頂點時的執行時間是 O(n²)。
能夠對資料結構下功夫的話,執行時間能壓縮到 O(m+n㏒n)。
・邊沒有負權重的圖形戴克斯特拉演算法(執行時間較短)。
・邊有負權重的圖形貝爾曼-福特演算法(正確求解最短路徑)。

A*演算法

從戴克斯特拉演算法所發展出來的演算法。A*預先設定推測權重,再根據推測權重的資訊來減少無謂的計算。

A* Algorithm
A* Algorithm
補充:由人來事先設定的推測權重,稱為「試探權重」(Heuristic Cost)。適用於能獲得各地點到終點之距離的線索,而試探權重越接近從所在地到終點的實際權重,A*演算法搜尋效率越佳。反之,當沒有線索時,就不適用A*演算法。廣泛用於遊戲程式中追逐玩家的敵人行動等的運算。運算量大會影響遊戲執行速度,須考慮混用其他演算法,或是僅用於特定場景。

--

--

IgorChien

Genius is one per cent inspiration, ninety-nine per cent perspiration.學無止盡