深度優(yōu)先算法
定義
深度優(yōu)先算法即深度優(yōu)先搜索算法(英語:Depth-First-Search,DFS)是一種用于遍歷或搜索樹或圖的算法。 沿著樹的深度遍歷樹的節(jié)點(diǎn),盡可能深的搜索樹的分支。 當(dāng)節(jié)點(diǎn)v的所在邊都己被探尋過,搜索將回溯到發(fā)現(xiàn)節(jié)點(diǎn)v的那條邊的起始節(jié)點(diǎn)。 這一過程一直進(jìn)行到已發(fā)現(xiàn)從源節(jié)點(diǎn)可達(dá)的所有節(jié)點(diǎn)為止。
具體思想
當(dāng)我們想使用通過深度優(yōu)先搜索算法遍歷一個(gè)圖的時(shí)候,我們首先需要做以下幾個(gè)步驟
- 從最開始的節(jié)點(diǎn)A開始,獲取與它相鄰的節(jié)點(diǎn)B
- 判斷這個(gè)節(jié)點(diǎn)是否被訪問過,如果訪問過,那么就不再重復(fù)訪問,如果沒有則進(jìn)行下一步
- 已當(dāng)前的節(jié)點(diǎn)B為當(dāng)前節(jié)點(diǎn),進(jìn)行深度優(yōu)先搜索算法
3.1. 將當(dāng)前節(jié)點(diǎn)的訪問狀態(tài)設(shè)為已訪問
3.2. 獲取當(dāng)前節(jié)點(diǎn)的下一個(gè)相鄰節(jié)點(diǎn)C
3.3. 判斷相鄰節(jié)點(diǎn)C是否是終止節(jié)點(diǎn),如果是終止節(jié)點(diǎn),那么算法結(jié)束
3.4. 判斷當(dāng)前節(jié)點(diǎn)是否被訪問過,如果沒有被訪問過,那么重復(fù)將訪問狀態(tài)設(shè)為已訪問,如果訪問過了,那么獲取下一個(gè)相鄰節(jié)點(diǎn),然后重復(fù)3.1至3.4
廣度優(yōu)先算法
定義
廣度優(yōu)先算法即廣度優(yōu)先搜索算法(英語:Breadth-First-Search,縮寫為BFS),又譯作寬度優(yōu)先搜索,或橫向優(yōu)先搜索,是一種圖形搜索算法。簡單的說,BFS是從根節(jié)點(diǎn)開始,沿著樹的寬度遍歷樹的節(jié)點(diǎn)。
具體思想
和深度優(yōu)先的一條路走到黑不同,廣度優(yōu)先是遍歷一個(gè)節(jié)點(diǎn)時(shí),要遍歷完它的所有子節(jié)點(diǎn),具體思想如下
- 從最開始的節(jié)點(diǎn)A開始,獲取與它相鄰的所有節(jié)點(diǎn)B,C等,如果元素沒有被訪問過就加入隊(duì)列
- 從隊(duì)列獲取之前加入的元素B作為當(dāng)前元素,獲取與它相鄰的元素D,E等,如果元素是終點(diǎn)就結(jié)束,如果元素沒有被訪問過就加入隊(duì)列
- 重復(fù)步驟2直到找到終點(diǎn)
深度優(yōu)先和廣度優(yōu)先的優(yōu)劣
深度優(yōu)先算法在計(jì)算時(shí),只會(huì)考慮這個(gè)問題是否有解,并不會(huì)考慮這個(gè)這個(gè)解是否是最優(yōu)解(即遍歷出最短路徑),而廣度優(yōu)先算法則可以獲得問題的最優(yōu)解(最短路徑),但是在遍歷時(shí)會(huì)保存一些數(shù)據(jù)信息,如果嵌套太深,那么就會(huì)占用較大內(nèi)存,所以在選擇算法時(shí),需要根據(jù)實(shí)際問題來進(jìn)行選擇,而不能一概而論
(未完待續(xù))