Dijkstra算法從初始節(jié)點開始,逐步尋找最短路徑至其他所有節(jié)點。算法的核心步驟如下:
1. 選定起始節(jié)點A,并進行初始化。
2. 執(zhí)行相關(guān)步驟,從未訪問的節(jié)點中找出距離起始節(jié)點A最近的節(jié)點D,并將其添加到已訪問 *** S中。根據(jù)特定的條件更新未訪問節(jié)點到起始節(jié)點的距離。
3. 在算法執(zhí)行過程中,可能會出現(xiàn)多個路徑長度相等的情況,此時算法會優(yōu)先選擇其中的一個路徑。例如,從A點到B點和C點的距離可能都是3,算法會先選擇B點。
4. Dijkstra算法保證能找到從起始節(jié)點到目標(biāo)節(jié)點的最短路徑,前提是圖中所有邊的權(quán)重非負(fù)。算法中的“顏色”區(qū)域表示算法掃描的范圍,顏色最淡的區(qū)域表示離起始點最遠。
5. Dijkstra算法的主要特點是采用貪心策略,從起始點開始,每次選擇距離起始點最近的未訪問節(jié)點,并更新其相鄰節(jié)點的距離,直到所有節(jié)點都被訪問過。
6. 該算法一般有兩種表述方式:永久和臨時標(biāo)號方式以及使用OPEN、CLOSE表的方式。在算法執(zhí)行過程中,會創(chuàng)建兩個表:OPEN表保存已生成但未考察的節(jié)點,CLOSED表記錄已訪問過的節(jié)點。
7. 算法具體執(zhí)行時,首先訪問距離起始點最近且未被檢查過的點,將其放入OPEN表中等待檢查。然后,從OPEN表中找出距起始點最近的點,考察這個點的所有子節(jié)點,并將這些子節(jié)點放入OPEN表中,同時更新它們的距離值。重復(fù)這個過程,直到所有節(jié)點都被訪問過。
讓我們想象你正站在一個錯綜復(fù)雜的迷宮的起點,即“首節(jié)點”。而你手中有一個記事本用來記錄迷宮中的捷徑和你的位置。開始時的第一步將是你探索的起點,即“1”節(jié)點。
你從起點“1”開始探索,發(fā)現(xiàn)可以到達的子節(jié)點有“2”和“3”以及“4”。你記錄下這些路徑和對應(yīng)的距離。接著,你繼續(xù)探索這些子節(jié)點與它們的子節(jié)點之間的關(guān)系。
你首先探索從“1”到“2”的路徑,然后到“2”的子節(jié)點中尋找可能的路徑。同樣地,你也會對“3”和“4”執(zhí)行相同的操作。在遍歷的過程中,你會比較每一條新發(fā)現(xiàn)的路徑與之前記錄的路徑,如果發(fā)現(xiàn)更短的路徑,你就會更新你的記事本。
完成一輪子節(jié)點的遍歷后,你會返回到起點“1”,并繼續(xù)向下一個未探索的子節(jié)點進行探索,如“-2”。同樣的,你比較新路徑與已知路徑,選擇更短的路徑進行記錄。這個過程會一直持續(xù),直到你遍歷完所有的節(jié)點。
在整個迷宮中,你最初將所有未訪問的路徑設(shè)定為無限大。然后你開始逐一探索,每次比較從起點到當(dāng)前節(jié)點的路徑長度加上當(dāng)前節(jié)點到其子節(jié)點的路徑長度是否小于已知的起點到該子節(jié)點的路徑長度。如果是的話,你就更新你的記事本,記錄下這條新發(fā)現(xiàn)的更短的路徑。
通過這樣的廣度優(yōu)先搜索方式,你最終會找到從起點到迷宮中任何節(jié)點的最短路徑。這就是廣度優(yōu)先搜索在圖論和算法中的應(yīng)用之一,也就是Dijkstra算法的基本思想。這種算法特別適用于尋找最短路徑問題,無論是對于迷宮還是復(fù)雜的網(wǎng)絡(luò)圖都是非常有效的。