最近幾天沒咋注重做題,自己讀題大部分都有障礙,需要藉助翻譯。把課件上的代碼自己親手敲了一遍,發現其實有很多細節上的問題,不知道換別的題能不能處理好。
切入正題,這次主要總結一下廣度優先搜索(BFS)。
1) 算法原理
廣度優先搜索即Breadth First Search,也是圖遍歷算法的一種。用一句話概括就是:“我會分身我怕誰?!”。
BFS的具體算法描述爲選擇一個起始點v放入一個先進先出的隊列中,執行如下操作:
a. 如果隊列不爲空,彈出一個隊列首元素,記爲當前結點,執行b;否則算法結束;
b. 將與 當前結點 相鄰並且尚未被訪問的結點的信息進行更新,並且全部放入隊列中,繼續執行a;
維護廣搜的數據結構是隊列和HASH,隊列就是官方所說的open-close表,HASH主要是用來標記狀態的,比如某個狀態並不是一個整數,可能是一個字符串,就需要用字符串映射到一個整數,可以自己寫個散列HASH表,不建議用STL的map,效率奇低。
算法實現
廣搜一般用隊列維護狀態,寫成僞代碼如下:
def BFS(v):
resetArray(visited,false)
visited[v] = true
queue.push(v)
while not queue.empty():
v = queue.getfront_and_pop()
for u in adjcent_list[v]:
if visited[u] is false:
dosomething(u)
queue.push(u)
3)基礎算法樣式
int bfs()
{
/初始化,初始狀態存入隊列;
隊列首指針 head = 0;
尾指針 tail = 1;/
do
{
/指針 head 後移一位,指向擴展節點;/
for(int i = 1;i<=max;i++)
//max爲產生子節點的規則數;
{
if(子節點符合條件)
{
tail指針增1,把新節點存入列尾;
if(新節點與原已產生節點重複)
刪去該節點(取消入隊,tail減1);
else
if(新節點是目標節點)
輸出並退出;
}
}
}while(head<tail);
//隊列爲空;
}