深度優先搜尋與廣度優先搜尋

2021-07-01 23:35:56 字數 1885 閱讀 6980

深度優先遍歷的主要思想就是:首先以乙個未被訪問過的頂點作為起始頂點,沿當前頂點的邊走到未訪問過的頂點;當沒有未訪問過的頂點時,則回到上乙個頂點,繼續試探訪問別的頂點,直到所有的頂點都被訪問。

沿著某條路徑遍歷直到末端,然後回溯,再沿著另一條進行同樣的遍歷,直到所有的頂點都被訪問過為止。

通過上面的圖例可以非常直觀的了解深度優先搜尋的工作方式。下面來分析一下如何用**來實現它。

大家都知道,深度優先的主要思想就是「不撞南牆不回頭」,「一條路走到黑」,如果遇到「牆」或者「無路可走」時再去走下一條路。

所以先規定好乙個走路的規則,比如就按照右下左上順時針的方式去嘗試。

如上圖殭屍的位置是起始點,先往右走,但是有堵牆走不了,所以按照規定嘗試往下走。到達「1」的位置,此時重複剛才的步驟,先向右走可以走到「2」,再重複規則發現向右可以走到「3」,再重**現「下右左上」四個方向都不能走,這時候就退回「2」的位置嘗試向下走。。。依次類推直到走到最終的目的地。

聰明的你肯定已經發現了「遞迴」是實現深度優先搜尋的最好的方式。定義好規則然後就這樣遞迴的迴圈下去直到走到終點,請看下面的偽**:

void dfs()  

// 嘗試每乙個可走方向(右下左上)

for(i=0; i

程式中完整的深度優先搜尋**如下:

// 深度優先搜尋

public void dfs( int x, int y )

throws exception

;dfs_poslist.add(pos);

// 是否到達目的地

if (mmapview[y][x] == 8)

// 順時針迴圈,右下左上四個方向

for (int k = 0; k < 4; k++)}}

}// 判斷方向的陣列

int next =

, // 右

, // 下

, // 左

// 上

};

首先以乙個未被訪問過的頂點作為起始頂點,訪問其所有相鄰的頂點,然後對每個相鄰的頂點再訪問它們相鄰的未被訪問過的頂點,直到所有頂點都被訪問過,遍歷結束。

通過兩個圖例的對比,可以清楚的看到兩種搜尋演算法的區別。

深度優先就是一條路走到底,然後再嘗試下一條路。

廣度優先就是走到乙個點,將該點周圍可走的點走完,然後再按同樣規則走其他的點。(大家可以想像一下鋪滿的多公尺諾骨牌,將其中一塊推倒其餘周圍的骨牌也會一層層擴散式的倒塌)

所以先規定好乙個走路的規則,同樣按照右下左上順時針的方式去嘗試。

如上圖殭屍的位置是起始點,先往右走,但是有堵牆走不了,所以按照規定嘗試往下走。到達「1」的位置,在「1」處可以知道四周能走的點只有「2」。「2」能走的點有「3」,「4」。來到「3」,發現沒有可走的。來到「4」發現去可以去「5」。這樣依次進行下去就完成了廣度優先搜尋。

我們可以通過「佇列」來模擬上面的過程,偽**如下:

void dfs()  

; queue.offer(pos);

while (!queue.isempty())

x += next[k][1];

y += next[k][0];

// 是否出了邊界

boolean isout = x < 0 || x >= mapwidth || y < 0 || y >= mapheight;

if (!isout));}

}}}}

int next =

, // 右

, // 下

, // 左

// 上

};

相信通過上面的配圖和講解可以很清晰的理解深度優先搜尋和廣度優先搜尋,如果今後有時間我爭取再做乙個最短路徑的小demo。

廣度優先搜尋與深度優先搜尋

廣度優先搜尋使用的是步步為營的策略,每執行一步迴圈就會把所有可能的情況加入佇列,直到調出迴圈。適用於求最短的問題。深度優先搜尋則是依次遍歷每一種情況,直至找到問題的解。深度優先搜尋和廣度優先搜尋都屬於窮竭法。在執行記憶體空間上面,廣度優先搜尋與情況數成正比,而深度優先搜尋與遞迴深度成正比。inclu...

深度優先搜尋與廣度優先搜尋

首先我們以鍊錶的形式儲存乙個圖 struct edge vectorg2 maxvex int source 6 3 表示從頂點0到頂點1的邊的權值為10。以鄰接鍊錶形式生成該圖 void genedge 首先以乙個未被訪問過的頂點作為起始頂點,沿著當前頂點的邊走到未訪問過的頂點 當沒有未訪問過的頂...

廣度優先搜尋 深度優先搜尋

前言 這幾天複習圖論演算法,覺得bfs和dfs挺重要的,而且應用比較多,故記錄一下。廣度優先搜尋 有乙個有向圖如圖a 圖a廣度優先搜尋的策略是 從起始點開始遍歷其鄰接的節點,由此向外不斷擴散。1.假設我們以頂點0為原點進行搜尋,首先確定鄰接0的頂點集合s0 2.然後確定頂點1的集合s1 頂點2沒有鄰...