雙向BFS

來源:互聯網
上載者:User

標籤:

如果目標也已知的話,用雙向BFS能很大提高速度

單向時,是 b^len的擴充。

雙向的話,2*b^(len/2)  快了很多,特別是分支因子b較大時

至於實現上,網上有些做法是用兩個隊列,交替節點搜尋 ×,如下面的虛擬碼:
    while(!empty()){

            擴充正向一個節點

           遇到反向已經擴充的return

        擴充反向一個節點      

            遇到正向已經擴充的return      

      }

但這種做法是有問題的,如下面的圖

 

求S-T的最短路,交替節點搜尋(一次正向節點,一次反向節點)時

Step 1 : S –> 1 , 2

Step 2 : T –> 3 , 4

Step 3 : 1 –> 5

Step 4 : 3 –> 5   返回最短路為4,錯誤的,事實是3,S-2-4-T


 

我想,正確做法的是交替逐層搜尋,保證了不會先遇到非最優解就跳出,而是檢查完該層所有節點,得到最優值。
也即如果該層搜尋遇到了對方已經訪問過的,那麼已經搜尋過的層數就是答案了,可以跳出了,以後不會更優的了。
當某一邊隊列空時就無解了。

最佳化:提供速度的關鍵在於使狀態擴充得少一些,所以優先選擇隊列長度較少的去擴充,保持兩邊隊列長度平衡。這比較適合於兩邊的擴充情況不同時,一邊擴充得快,一邊擴充得慢。如果兩邊擴充情況一樣時,加了後效果不大,不過加了也沒事。

無向圖時,兩邊擴充情況類似。有向圖時,注意反向的擴充是反過來的 x->y(如NOIP2002G2字串變換)

 

雙向BFS

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.