BFS 和 DFS
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