閱讀532 返回首頁    go 京東網上商城


【算法小總結】廣度優先搜索剖析

廣度優先搜索

以前一直用搜索用的都是深搜,因為聽說有很多題能用廣搜就能用深搜什麼的。今天老老實實的去看廣搜了,結果發現我之前想的太天真的,DFSBFS不僅在性質上不同,而且對於某些題和某些情況,用BFSDFS要快(不是絕對)。

 

今天好好說道說道這個BFS(廣度優先搜索)

 

很多問題(如過迷宮問題),每走下一步,都要考慮很多種情況,這個時候,就要每一步每一步的去試探,去找到合適的方案,也是就是傳說中的“搜索”。

 

當然,想試探出結果,可以去將一種方案走到底,遇到不能走或者其他不符合要求的情況再退回來,選擇下一個方案繼續嚐試,這種可以稱作所謂的“深度優先搜索”(DFS;還有一種方式,就是所有方案我先都嚐試第一步,檢測是否找到結果,如果沒有,繼續嚐試所有方案的第二步。。。。直到找到合適的結果或方案,這種搜索方式成為“寬度優先搜索”。

 

當然,上麵的話是我自己對DFSBFS的理解和概括,下麵是官方的總結(摘自ppt

 

優先搜索也稱為寬度優先搜索,它是一種先生成的節點先擴展的策略。

 

廣度優先搜索算法如下:(用QUEUE

    (1) 把初始節點S0放入Open表中;

    (2) 如果Open表為空,則問題無解,失敗退出;

    (3) Open表的第一個節點取出放入Closed表,並記該節點為n

    (4) 考察節點n是否為目標節點。若是,則得到問題的解,成功退出;

    (5) 若節點n不可擴展,則轉第(2)步;

    (6) 擴展節點n,將其不在Closed表中的子節點放入Open表的尾部,並為每一個子節點設置指向父節點的指針,然後轉第(2)步。

 

 

讓我們來看看廣度優先搜索和深度優先搜索的區別在哪

首先這是我們要搜索的圖(圖片摘自互聯網):

 

用深搜:

 

搜索方式:

路徑1 ==> A --> B --> E --> H  路徑2 ==> i

路徑3 ==> C  路徑4 ==> D --> F --> K --> L  路徑5 ==> G

 

用廣搜:

 

搜索方式:

路徑1 ==> A  路徑2 ==> B --> C --> D  路徑3 ==> E --> F --> G

路徑4 ==> H --> i --> K  路徑5 ==> L

 

如果要搜的答案在H,那麼很顯然深搜先搜到

如果答案在D,那麼廣搜比深搜先搜到

 

DFSBFS的效率還是分情況描述的,所以我就不做過多比較。。。

 

我來說說我總結的廣搜過程:

1.建立一個空隊列,將根節點Root(搜索的初始第一步)放在隊首。

2.Root出隊列,同時將Root的所有可能情況(假設s1,s2,s3)壓入隊列

3.然後判斷隊首元素(s1),判斷s1是否是可行情況,如果可行,將s1的下一步可行情況壓入隊列。s1出隊列。

4.接下來一直執行23兩步,直到找到答案或者全部搜索完畢。

 

如(圖畫的不好見諒!)

 

假設需要從1開始,找到5,隊列的變換過程如下:

 

開始1(此時隊列中有 (下麵先後順序按隊首到隊尾))

1出隊列,將1的可能解23加入隊列 (此時隊列中有 3

2出隊列,將2的可能解45加入隊列 (此時隊列中有 345

3出隊列,將3的可能解67加入隊列 (此時隊列中有 4567

4出隊列,將4的可能解89加入隊列 (此時隊列中有 56789

5出隊列,找到答案,結束。

 

可以看看下麵的例題:https://blog.csdn.net/acmman/article/details/38345509

最後更新:2017-04-03 05:39:37

  上一篇:go 從Storm和Spark 學習流式實時分布式計算的設計
  下一篇:go STL 概述