BFS和DFS演算法學習總結

2021-09-24 21:47:38 字數 2656 閱讀 5606

bfs:這是一種基於佇列這種資料結構的搜尋方式,它的特點是由每乙個狀態可以擴充套件出許多狀態,然後再以此擴充套件,直到找到目標狀態或者佇列中頭尾指標相遇,即佇列中所有狀態都已處理完畢。

廣度優先搜尋(bfs

有乙個有向圖如圖a

圖a廣度優先搜尋的策略是:

從起始點開始遍歷其鄰接的節點,由此向外不斷擴散。

1.假設我們以頂點0為原點進行搜尋,首先確定鄰接0的頂點集合s0 = 。

2.然後確定頂點1的集合s1 = ,頂點2沒有鄰接點,所以集合為空。

3.然後確定3的鄰接點集合s3,因為2已經被遍歷過,所以不考慮,所以由頂點3知道的鄰接點集合s3 = 。

4.然後再確定頂點4的鄰接點集合,頂點4沒有更多的鄰接點了,此時也沒有還未遍歷的鄰接點集合,搜尋終止。

動態過程

**的實現思路:

bfs()

}

dfs深度優先遍歷(dfs繼續以圖a為例

圖a深度優先遍歷的策略是:

從乙個頂點v出發,首先將v標記為已遍歷的頂點,然後選擇乙個鄰接於v的尚未遍歷的頂點u,如果u不存在,本次搜素終止。如果u存在,那麼從u又開始一次dfs。如此迴圈直到不存在這樣的頂點。

比如圖a中

1.從頂點0開始,將0標記為已遍歷,然後選擇未被遍歷的鄰接0的頂點1。

2.標記頂點1,然後選擇3並標記,然後選擇頂點3鄰接的頂點2。

3.頂點2標記後沒有與它鄰接的未標記的點,所以返回3選擇另乙個鄰接3並且未被標記的頂點4。

動態過程

**的實現思路:

dfs(頂點v)

總結:

bfs:對於解決最短或最少問題特別有效,而且尋找深度小,但缺點是記憶體耗費量大(需要開大量的陣列單元用來儲存狀態)。 

dfs:對於解決遍歷和求所有問題有效,對於問題搜尋深度小的時候處理速度迅速,然而在深度很大的情況下效率不高。

leetcode547. friend circles班上有 n 名學生。其中有些人是朋友,有些則不是。他們的友誼具有是傳遞性。如果已知 a 是 b 的朋友,b 是 c 的朋友,那麼我們可以認為 a 也是 c 的朋友。所謂的朋友圈,是指所有朋友的集合。給定乙個 n * n 的矩陣 m,表示班級中學生之間的朋友關係。如果m[i][j] = 1,表示已知第 i 個和 j 個學生互為朋友關係,否則為不知道。你必須輸出所有學生中的已知的朋友圈總數。示例 1:

輸入:

[[1,1,0],

[1,1,0],

[0,0,1]]

輸出: 2 

說明:已知學生0和學生1互為朋友,他們在乙個朋友圈。

第2個學生自己在乙個朋友圈。所以返回2。

示例 2:

輸入:

[[1,1,0],

[1,1,1],

[0,1,1]]

輸出: 1

說明:已知學生0和學生1互為朋友,學生1和學生2互為朋友,所以學生0和學生2也是朋友,所以他們三個在乙個朋友圈,返回1。

注意:n 在[1,200]的範圍內。

對於所有學生,有m[i][i] = 1。

如果有m[i][j] = 1,則有m[j][i] = 1。

class solution 

} return count; }

queueq = new linkedlist<>();

public void bfs(int m, int visited, int i)

}} }

}

class solution 

}return ret;

}private void dfs(int m, boolean visited, int i) }}

}

演算法學習 DFS與BFS

一。深度優先搜尋 深度優先搜尋 是一種列舉所有完整路徑以遍歷所有情況的搜尋方法。類似樹的先根遍歷。簡單來說,就是一直往深處走,直到找到解或走不下去了為止。可以使用棧來實現,用棧儲存未被檢測的結點,結點按照深度優先的次序被訪問並依次被壓入棧中,並以相反的次序出站進行新的檢測。也可以使用遞迴實現,相對 ...

DFS和BFS學習總結

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

DFS和BFS演算法

本質區別 bfs 的重點在於佇列,而 dfs 的重點在於遞迴。這是它們的本質區別。dfs 演算法 是一種利用遞迴 實質上是用棧來儲存未訪問的結點,先進後出 實現的搜尋演算法,直到找到解或走不下去為止。簡單來說,其搜尋過程和 不撞南牆不回頭 樹的先序遍歷 類似。bfs演算法 是一種利用佇列 用佇列來儲...