1. 程式人生 > >BFS 和 DFS

BFS 和 DFS

status pos preorder 速度 算法 遍歷 white postorder 深度優先

BFS and DFS

一般來說,能用DFS解決的問題,都能用BFS。DFS容易爆棧,而BFS可以自己控制隊列的長度。深度優先一般是解決連通性問題,而廣度優先一般是解決最短路徑問題。

  • 廣優的話,占內存多,能找到最優解,必須遍歷所有分枝. 廣優的一個應用就是迪科斯徹單元最短路徑算法.

  • 深優的話,占內存少,能找到最優解(一定條件下),但能很快找到接近解(優點),可能不必遍歷所有分枝(也就是速度快), 深優的一個應用就是連連看遊戲.

  • 兩個算法都是O(V+E),在用到的時候適當選取。

A Tree is typically traversed in two ways:

  • Breadth First Traversal (Or Level Order Traversal)

  • Depth First Traversals

    • Inorder Traversal (Left-Root-Right)

    • Preorder Traversal (Root-Left-Right)

    • Postorder Traversal (Left-Right-Root)

BFS(G,s)

for each vertex v in V[G]

status[v] = WHITE

/******其他初始化******/

status[s] = GRAY //s是原點

queue q

入隊(q,s);

while q非空

t = 出隊(q);

for each vertex v in Adj[t] //與t鄰接的點

if status[v] = WHITE //只對未訪問的操作

status[v] = GRAY //標記為第一次訪問

/******其他操作******/

入隊(q,v)

status[t] = BLACK //此點已經處理完了

DFS(G,s)

for each vertex v in V(G)

status[v] = WHITE

/******其他初始化******/

for each vertex v in V(G)

if(status[v]==WHITE)

DFS-VISIT(v)

DFS-VISIT(v)

status[v] = GRAY

for each vertex t in Adj(v)

if status[t] = WHITE

DFS-VISIT(t)

/******其他操作******/

status[v] = BLACK

BFS 和 DFS