dfs和bfs的總結

2021-08-25 19:41:15 字數 1050 閱讀 1908

dfs:

dfs演算法是乙個對連通圖進行遍歷的演算法。它的思想是從乙個被選定的點出發一條路走到底,如果得不到目的解,那就返回到上乙個節點,然後換一條路繼續走到底,直到找到目的解返回或者全部遍歷完返回乙個事先定好的值。dfs一般借用遞迴完成整個演算法的構造。

dfs演算法的一般框架經我總結大致為下:

int dfs()

}

bfs:

bfs演算法是也乙個對連通圖進行遍歷的演算法。它的思想是從乙個被選定的點出發;然後從這個點的所有方向每次只走一步的走的到底(即其中乙個方向走完一步之後換下乙個方向繼續走);就像池塘中被扔進一顆石子隨後向四周盪起的波紋。如果得不到目的解,那就返回事先定好的值,如果找到直接返回目的解。與dfs不同的是,bfs不是運用的遞迴,而是運用佇列和函式內迴圈構造的。

bfs演算法的一般構架經我總結大致如下:

void bfs()

}

總的來說,dfs和bfs大都運用在圖的處理上:如迷宮,八皇后,n皇后,油田,連通塊,數獨等,在這些型別的題上幾乎全需要dfs或bfs來解,或者說有些難度更大的需要bfs+dfs或bfs+bfs才能完成。

對比dfs和bfs:

當遇到一些層次較深的樹圖時,dfs一讀到底的風格就不太適合一些限制時間的題,因為針對這些記憶體巨大的,使用dfs就會比較耗時,比方說乙個數有1000個樹枝,每個樹枝有100個子葉,第1000的第一顆葉子就是正解,但是在遍歷的時候卻選擇從第乙個樹枝開始遍歷且一讀到底,遍歷到正解得時候已經做了999*100次遍歷了,這時只要把dfs換成bfs,就會節約許多時間,只需要1000次的遍歷就可以找到答案,所以由上可得,在一些大的記憶體或者層次比較的大樹,應選擇使用bfs來解決;反之,則使用dfs。c

還有一些根據題意就可以看出來是選擇dfs還是bfs;比如題中需要的目的解是需要判斷從最初的狀態能否得到,這個時候就應該選擇dfs了。像一些需要一步一步的完成就要選擇bfs。

DFS和BFS的總結

如果我們使用 dfs bfs 只是為了遍歷一棵樹 一張圖上的所有結點的話,那麼 dfs 和 bfs 的能力沒什麼差別,我們當然更傾向於更方便寫 空間複雜度更低的 dfs 遍歷。不過,某些使用場景是 dfs 做不到的,只能使用 bfs 遍歷。這就是本文要介紹的兩個場景 層序遍歷 最短路徑 還有寫 df...

DFS和BFS學習總結

深度遍歷就是在圖中從乙個頂點開始,按照乙個規則不重複地走下去。就是不撞南牆不回頭一樣。假如從a頂點開始,按照乙個規則去走 假如我們按照一直字典順序走 那麼就從a走到b再從b走到了c,走到c後再按照字典順序的時候,發現a已經走過,那麼此時就退回到c點,選擇另乙個d走下去。就和樹的前序遍歷是一樣的。1 ...

BFS和DFS演算法學習總結

bfs 這是一種基於佇列這種資料結構的搜尋方式,它的特點是由每乙個狀態可以擴充套件出許多狀態,然後再以此擴充套件,直到找到目標狀態或者佇列中頭尾指標相遇,即佇列中所有狀態都已處理完畢。廣度優先搜尋 bfs 有乙個有向圖如圖a 圖a廣度優先搜尋的策略是 從起始點開始遍歷其鄰接的節點,由此向外不斷擴散。...