图论(三)图的遍历
圖建構好后,針對具體的問題,我們常常需要通盤的讀取圖中的信息,包括頂點(vertex)和邊(edge),以及它們之間的關系。這種讀取圖中所有信息的方法就是圖的遍歷(traversal),也稱為搜索(search),就是從圖中某個頂點出發,沿著一些邊訪問圖中所有的頂點,且使每個頂點僅被訪問一次。遍歷是很多圖論算法的基礎。
遍歷需要決定從哪里開始讀,依照什么順序讀,要讀到哪里為止。如果遍歷方法與需解決問題結合的好,甚至還可以一邊讀取圖的信息,一邊順手解決問題!
(1)圖和樹的遍歷
樹的遍歷是從根節點開始的,由于每個節點都只有一個雙親,因此其遍歷還是相對簡單的。而圖的遍歷則可以選擇從任意一個節點開始,同時圖中每一個節點都可能與其余的節點相鄰接,不可避免的會多次訪問同一個節點,因此在遍歷的過程中需要將已訪問的節點打上標記,以避免重復。
(2)遍歷的方法
遍歷有2個著名的方法:深度優先搜索(DFS, depth first search)和廣度優先搜索(BFS, breadth first search)。
以上圖的中國公路網為例,我們從北京出發,采用怎樣的遍歷方法訪問所有的城市呢?
廣度優先就是從北京出發,先訪問那些直接與北京相連的城市,比如天津、沈陽、包頭、太原、鄭州、濟南等;然后再訪問那些城市和這些已訪問過的城市相連,如長春與沈陽相連,武漢與鄭州相連,南京與濟南相連等。而后再訪問與長春、武漢、南京等相連的城市,如哈爾濱、上海等,直到把所有的城市都訪問一遍為止。
深度優先就是從北京出發,隨便找一個相連的城市,如濟南,作為訪問的城市,然后從濟南出發,隨便找一個與濟南相連的城市,比如南京,再從南京出發,隨便找一個與南京相連的城市,如上海,一直找到頭,直到找不到城市,再往回找。因為一條路“走到黑”,所以叫深度優先。
這兩種方法都可以保證訪問到全部的城市。當然,前面也提到過,不論采用何種方法,都應該記錄下已訪問的城市,避免重復訪問或遺漏。
深度優先和廣度優先分別使用了stack和queue兩種數據結構,得到了不同的遍歷順序。這個以后再分別詳細介紹它們的工作原理和具體方法。
(3)遍歷的時間復雜度
關于圖遍歷的時間復雜度。對于一個圖來說,不管我們使用什么樣的圖存儲結構和搜索方法,該圖中的各個頂點(vertex)和各條邊(edge)都是必須要搜索到的。因此,遍歷一個圖的時間復雜度至少是O(V+E)級別的,V,E分別表示頂點和邊的數量。
當然,這里的遍歷指的是用來訪問圖中每個節點的。但有時候,我們其實只需要尋找某個特定節點或某一類節點,對于這種搜索,我們也可以通過設計高效的算法來大大提高搜索效率。
總結
- 上一篇: 破窗理论---到底是破坏还是创造?
- 下一篇: 图论(六)图的两种表示方法