![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCM581dvRWYoNHLwEzX5xCMx8FesU2cfdGLwATMfRHLGZkRGZkRfJ3bs92YskmNhVTYykVNQJVMRhXVEF1X0hXZ0xiNx8VZ6l2cssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmLyMTNzkDZjVzYiJGZyAjN3ATM2UTY4Q2NlZTYiNDO2MzLcZjMvwVMxgTMwIzLcd2bsJ2LcNXZnFWbp9CXt92Yu8GdjFTNuITavw1LcpDc0RHaiojIsJye.jpg)
網上的相關教程非常多,基礎知識自行搜尋即可。
習題主要選自Orelly出版的《資料結構與算法javascript描述》一書。
參考代碼可見:https://github.com/dashnowords/blogs/tree/master/Structure/graph
一.圖的基本知識
基本概念
圖是由邊的集合和點的集合組成的。如果圖的邊有方向(或者說圖中的頂點對是有序的)則成為有向圖,如果邊沒有方向則稱為無向圖。
基本模組化
圖可以用來對現實中許多事物進行模組化。比如交通流量,計算機網絡等。
二.基本練習
- 建構一個圖的類
Graph
-
圖的深度優先搜尋(DFS)
深度優先搜尋從起始頂點開始,直到到達最後一個頂點,然後回溯,直到周遊完随後頂點或查找到指定頂點。深度優先是應用非常廣泛的基本搜尋思想,往往借助
結構來實作。demo中的棧
直接使用函數的調用棧來追蹤搜尋,如果資料量很大,則可以通過手動用一個數組來管理dfs.js
。棧
-
圖的廣度優先搜尋(BFS)
廣度優先搜尋從第一個頂點開始,嘗試通路盡可能靠近它的頂點,搜尋範圍基本是逐層移動的。它的實作依靠資料結構中的
來實作。隊列
-
BFS查找最短路徑
圖最常見的操作之一就是尋找從一個頂點到另一個頂點的最短路徑。書中示例中通過
這個數組來存儲頂點的通路路徑,例如w節點是通過通路v節點的臨近節點時通路的,那麼就執行如下指派this.edgeTo
,并将節點标記為已通路,由于廣度優先搜尋逐層擴充的特性,最終通過this.edgeTo[w] = v
疊代顯示出的路徑必然是搜尋中最先實作标記的路徑,也就是最短的路徑,是以并不需要将每次通路都記錄下來最終再比較步長。this.edgeTo
-
拓撲排序
拓撲排序用于輸出一個有向無環圖所有頂點的線性序列,使之滿足:
a 每個頂點隻出現一次