數據結構與算法之深度搜索(理論+代碼)

一,圖的簡介

  圖是一種與樹有些相似的數據結構,實際上在數學理論中,樹是圖的一種形式,但在計算機程序中,圖的應用方式與樹不一樣。圖通常有固定的形狀,這形狀由物理或抽象的問題所決定的,如圖,節點表示城市,邊爲公路,可以將此現實生活中的地圖抽象爲圖b,當討論圖時,節點通常叫做頂點。

1,連接:如果2個頂點被一條邊連接,我們就說這兩點是連接的,圖中A 和 E是連接的,I與F就不是連接的 。

2,路徑:路勁就邊的序列,比如A到J的路徑就是 A EJ或ACDJ等等。

3,有向圖和帶權圖:下篇博客再討論帶權圖和有向圖,此文章只討論無向圖,無權圖。

數據結構與算法之深度搜索(理論+代碼)

二,在程序中表示圖

  1,頂點:在程序中,只是簡單的把頂點編號 ,根據程序語言慣例,從0到N-1進行編號(N爲頂點個數),但在現實生活中頂點是有真實的對象,比如頂點表示城市時,那麼頂點應該包含城市的名稱,位置,海拔等等,所以通常將頂點設計成一個類,此篇文章例子只存一個字母。同時還要有個下標表示頂點,下標將在數組中起到關鍵作用。

頂點類如下:
數據結構與算法之深度搜索(理論+代碼)

頂點對象存在數組中,然後用下標表示頂點,本例子中,用數組vertexList表示。

 2 ,邊:通常邊的表示方法有2種:鏈接矩陣和鏈接表,本例子討論鏈接矩陣。鏈接矩陣是一個2維數組,有N個頂點就產生 N*N 2維數組

有4個頂點,1表示2頂點是鏈接的,如圖A的下一個鏈接頂點一次爲B,C,D。

三,在圖中添加頂點與邊

vertexList爲頂點集合數組,nvertx爲當前集合的頂點數

數據結構與算法之深度搜索(理論+代碼)

增加邊,正反方向都設置爲1 ;

四,Grouph類:創建鏈接表,鏈接矩陣,插入頂點與邊。

數據結構與算法之深度搜索(理論+代碼)

五,搜索

深度搜索需要做三件事:首先訪問頂點,其次把該點放入棧中,最後標記該點。

數據結構與算法之深度搜索(理論+代碼)

步驟:

先訪問入口A,標記A,把A放入棧中。假設規定按照腳標順序訪問,查找A點的鏈接點,那麼接下來訪問B,標記B,把B放入棧中,做相同的是直到訪問到H,標記H,把H放入棧中。

規則1:如果可能,訪問節點,標記節點,節點放入棧中。

再次應用規則1,查找H的鏈接節點,沒有找到,棧彈出H,查找棧頂F未訪問過的鏈接點,沒有找到,彈出F,查找棧頂B的鏈接頂點,執行相同步驟,直到彈出B,找A的未訪問過的鏈接頂點。

規則2:當不能執行規則1時,若棧不爲控,彈出棧頂節點

接着訪問A的鏈接點C,然後D G I 最後E

規則3:如果不能執行規則1和規則2,就完成了整個搜索過程

在此搜索過程中,尋找某點的未訪問過的連接點尤爲重要,具體方法如下
數據結構與算法之深度搜索(理論+代碼)

根據規則123,設計搜索方法

數據結構與算法之深度搜索(理論+代碼)

棧的設計同樣重要 ,代碼如下

數據結構與算法之深度搜索(理論+代碼)

啓動類如下

數據結構與算法之深度搜索(理論+代碼)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章