網上的相關教程非常多,基礎知識自行搜尋即可。
習題主要選自Orelly出版的《資料結構與演算法javascript描述》一書。
參考程式碼可見:https://github.com/dashnowords/blogs/tree/master/Structure/graph
一.圖的基本知識
基本概念
圖是由邊的集合和點的集合組成的。如果圖的邊有方向(或者說圖中的頂點對是有序的)則成為有向圖,如果邊沒有方向則稱為無向圖。
基本建模
圖可以用來對現實中許多事物進行建模。比如交通流量,計算機網路等。
二.基本練習
-
構建一個圖的類
Graph
-
圖的深度優先搜尋(DFS)
深度優先搜尋從起始頂點開始,直到到達最後一個頂點,然後回溯,直到遍歷完隨後頂點或查詢到指定頂點。深度優先是應用非常廣泛的基本搜尋思想,往往藉助
棧
結構來實現。demo中的dfs.js
直接使用函式的呼叫棧來追蹤搜尋,如果資料量很大,則可以通過手動用一個陣列來管理棧
。 -
圖的廣度優先搜尋(BFS)
廣度優先搜尋從第一個頂點開始,嘗試訪問儘可能靠近它的頂點,搜尋範圍基本是逐層移動的。它的實現依靠資料結構中的
佇列
來實現。 -
BFS查詢最短路徑
圖最常見的操作之一就是尋找從一個頂點到另一個頂點的最短路徑。書中示例中通過
this.edgeTo
這個陣列來儲存頂點的訪問路徑,例如w節點是通過訪問v節點的臨近節點時訪問的,那麼就執行如下賦值this.edgeTo[w] = v
,並將節點標記為已訪問,由於廣度優先搜尋逐層擴充套件的特性,最終通過this.edgeTo
迭代顯示出的路徑必然是搜尋中最先實現標記的路徑,也就是最短的路徑,所以並不需要將每次訪問都記錄下來最終再比較步長。 -
拓撲排序
拓撲排序用於輸出一個有向無環圖所有頂點的線性序列,使之滿足:
a 每個頂點只出現一次
b 若存在一條從頂點A到B的路徑,那麼序列中A一定出現在B前面。
書中給出的示例在輸出時描述有誤,導致輸出結果與真實的排序是相反的,在拓撲排序時採用了
棧
結構,入棧順序是反的,正確的輸出順序是按照出棧順序來輸出。
三.小結
圖論是非常複雜的領域,對數學基礎要求較高,感興趣的讀者可以自行繼續研究。至此,基本資料結構的課就補完了,希望你也認真做了練習,完成了這個基本的掃盲過程。