1. 程式人生 > 實用技巧 >廣度優先搜尋(BFS)解題總結

廣度優先搜尋(BFS)解題總結

定義

廣度優先搜尋演算法(Breadth-First-Search),是一種圖形搜尋演算法。

簡單的說,BFS是從根節點開始,沿著樹(圖)的寬度遍歷樹(圖)的節點。

如果所有節點均被訪問,則演算法中止。

BFS同樣屬於盲目搜尋。

一般用佇列資料結構來輔助實現BFS演算法。

如下圖,其廣度優先演算法的遍歷順序為:1->2->3->4->5->6->7->8

演算法步驟

  1. 首先將根節點放入佇列中。
  2. 從佇列中取出第一個節點,並檢驗它是否為目標。如果找到目標,則結束搜尋並回傳結果。否則將它所有尚未檢驗過的直接子節點加入佇列中。
  3. 若佇列為空,表示整張圖都檢查過了——亦即圖中沒有欲搜尋的目標。結束搜尋並回傳“找不到目標”。
  4. 重複步驟2。

演算法模板

# Python
def BFS(root):
    visited = set()
	queue = [] 
	queue.append([root]) 

	while queue: 
		node = queue.pop() 
		visited.add(node)

		process(node) 
		nodes = generate_related_nodes(node) 
		queue.push(nodes)

	# other processing work
// Golang
type TreeNode struct {
    Val   int
    Left  *TreeNode
    Right *TreeNode
}

func BFS(root *TreeNode){
    visited := make(map[*TreeNode]bool)
    queue := make([]*TreeNode,0)
    queue = append(queue, root)
    
    for len(queue)>0{
        node := queue[0]
        queue = queue[1:]
        visited[node] = true
        
        process(node)
        nodes := generate_related_nodes(node)
        queue = append(queue, nodes...)
    }
    
    // other processing work
}

要點

  • 使用佇列 queue
  • 記錄已訪問節點 visited ,通常使用雜湊表
  • 一般要抽象成樹、圖等模型

適用場景

  • 二維陣列

實戰題目

參考資料