4.20 訓練日誌

     最近幾天沒咋注重做題,自己讀題大部分都有障礙,需要藉助翻譯。把課件上的代碼自己親手敲了一遍,發現其實有很多細節上的問題,不知道換別的題能不能處理好。
      切入正題,這次主要總結一下廣度優先搜索(BFS)。
      1) 算法原理
      廣度優先搜索即Breadth First Search,也是圖遍歷算法的一種。用一句話概括就是:“我會分身我怕誰?!”。          
      BFS的具體算法描述爲選擇一個起始點v放入一個先進先出的隊列中,執行如下操作:           
      a. 如果隊列不爲空,彈出一個隊列首元素,記爲當前結點,執行b;否則算法結束;           
      b. 將與 當前結點 相鄰並且尚未被訪問的結點的信息進行更新,並且全部放入隊列中,繼續執行a;
      維護廣搜的數據結構是隊列和HASH,隊列就是官方所說的open-close表,HASH主要是用來標記狀態的,比如某個狀態並不是一個整數,可能是一個字符串,就需要用字符串映射到一個整數,可以自己寫個散列HASH表,不建議用STL的map,效率奇低。
  1. 算法實現
    廣搜一般用隊列維護狀態,寫成僞代碼如下:
    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);
    //隊列爲空;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章