BFS
廣度優(yōu)先搜索算法(Breadth-First-Search),又譯作寬度優(yōu)先搜索,或橫向優(yōu)先搜索,簡稱BFS,是一種圖形搜索算法。簡單的說,BFS是從根節(jié)點開始,沿著樹的寬度遍歷樹的節(jié)點。如果所有節(jié)點均被訪問,則算法中止。廣度優(yōu)先搜索的實現(xiàn)一般采用open-closed表。
特性
?
空間復(fù)雜度
因為所有節(jié)點都必須被儲存,因此BFS的空間復(fù)雜度為 O(|V| + |E|),其中 |V| 是節(jié)點的數(shù)目,而 |E| 是圖中邊的數(shù)目。注:另一種說法稱BFS的空間復(fù)雜度為?O(BM),其中 B 是最大分支系數(shù),而 M 是樹的最長路徑長度。由于對空間的大量需求,因此BFS并不適合解非常大的問題。
時間復(fù)雜度
最差情形下,BFS必須尋找所有到可能節(jié)點的所有路徑,因此其時間復(fù)雜度為 O(|V| + |E|),其中 |V| 是節(jié)點的數(shù)目,而 |E| 是圖中邊的數(shù)目。
最佳解
若所有邊的長度相等,廣度優(yōu)先搜索算法是最佳解——亦即它找到的第一個解,距離根節(jié)點的邊數(shù)目一定最少;但對一般的圖來說,BFS并不一定回傳最佳解。這是因為當(dāng)圖形為加權(quán)圖(亦即各邊長度不同)時,BFS仍然回傳從根節(jié)點開始,經(jīng)過邊數(shù)目最少的解;而這個解距離根節(jié)點的距離不一定最短。這個問題可以使用考慮各邊權(quán)值,BFS的改良算法成本一致搜尋法(en:uniform-cost search)來解決。然而,若非加權(quán)圖形,則所有邊的長度相等,BFS就能找到最近的最佳解。
廣度優(yōu)先搜索算法的應(yīng)用
?
廣度優(yōu)先搜索算法能用來解決圖論中的許多問題,例如:
- 尋找圖中所有連接元件(Connected Component)。一個連接元件是圖中的最大相連子圖。
- 尋找連接元件中的所有節(jié)點。
- 尋找非加權(quán)圖中任兩點的最短路徑。
- 測試一圖是否為二分圖。
- (Reverse) Cuthill–McKee算法
?
尋找連接元件
由起點開始,執(zhí)行廣度優(yōu)先搜索算法后所經(jīng)過的所有節(jié)點,即為包含起點的一個連接元件。
廣度優(yōu)先搜索,即BFS(Breadth First Search),是一種相當(dāng)常用的圖算法,其特點是:每次搜索指定點,并將其所有未訪問過的鄰近節(jié)點加入搜索隊列,循環(huán)搜索過程直到隊列為空。
??????? 算法描述如下:
??????? (1)將起始節(jié)點放入隊列尾部
???????? (2)While(隊列不為空)
取得并刪除隊列首節(jié)點Node
????????????????????????? 處理該節(jié)點Node
????????????????????????? 把Node的未處理相鄰節(jié)點加入隊列尾部
???????? 使用該算法注意的問題:
??????? (1)使用該算法關(guān)鍵的數(shù)據(jù)結(jié)構(gòu)為:隊列,隊列保證了廣度渡優(yōu)先,并且每個節(jié)點都被處理到
???????? (2)新加入的節(jié)點一般要是未處理過的,所以某些情況下最初要對所有節(jié)點進(jìn)行標(biāo)記
???????? (3)廣度優(yōu)先在實際使用時,很對情況已超出圖論的范圍,將新節(jié)點加入隊列的條件不再局限于
相鄰節(jié)點這個概念。例如,使用廣度優(yōu)先的網(wǎng)絡(luò)爬蟲在抓取網(wǎng)頁時,會把一個鏈接指向的網(wǎng)頁中的所有
URL加入隊列供后續(xù)處理。
1.初始化數(shù)組dis,q2.while(隊列非空) {1.st+=1;2.找相鄰點若dis=-1 : 1.加入隊列2.修改dis }?
轉(zhuǎn)載于:https://www.cnblogs.com/zsh2016/p/5763987.html
總結(jié)
- 上一篇: Windows下更改MySQL 数据库文
- 下一篇: F - Monkey Banana Pr