본문 바로가기
Algorithm

BFS와 DFS

by Doromi 2019. 5. 2.
728x90
반응형

너비 우선 탐색(BFS , Breadth-First Search)

루트 노드(혹은 다른 임의의 노드)에서 시작해서 인접한 노드를 먼저 탐색하는 방법

사용하는 경우 : 두 노드 사이의 최단 경로 혹은 임의의 경로를 찾고 싶을 때 선택

ex) A,B사이에 존재하는 경로를 찾는 경우, A에서 가까운 곳 부터 탐색

그래프 탐색의 경우, 어떤 노드를 방문했었는지 여부를 반드시 검사해야 한다.
-> 이를 검사하지 않을 경우, 무한루프에 빠질 위험이 있다.

 

BFS는 방문한 노드들을 차례로 저장한 후 꺼낼 수 있는 자료구조인 큐를 사용한다.

->프림과 다익스트라 알고리즘과 유사하다.

 

BFS(G,k)
q.push(G.root)
root.visit = true

while !q.isEmpty()
node r = q.front()
q.pop()
for each n is adjacent to r
	if n.visit == false
		n.visit = true
        q.push(n)

 

 


 

깊이 우선 탐색(DFS, Depth-First Search)

 

루트 노드에서 시작해서 다음 분기로 넘어가기 전에 해당 분기를 완벽하게 탐색하는 방법

 

미로를 탐색할 때 한 방향으로 갈 수 있을때까지 계속 가다가 더 이상 갈 수 없게 되명

다시 가장 가까운 갈림길로 돌아와서 이곳으로부터 다른 방향으로 다시 탐색을 진행하는 방법과 유사

 

사용하는 경우 : 모든 노드를 방문하고자 하는 경우에 이 방법을 선택한다.

트리 순회는 모두 DFS의 한 종류이다.
어떤 노드를 방문했었는지 여부를 반드시 검사해야 한다,

 

DFS(Start,Goal)
stack S
S.push(Start)
Start.visit = true
while S is not empty
Node n = S.first()
S.pop()
if n == Goal
	return Node
else
	if(n.visit == false)
    	n.visit = true
        S.push(n.child)
728x90
반응형

'Algorithm' 카테고리의 다른 글

최장 공통 부분 수열  (0) 2019.05.05
최장 증가 부분 수열  (0) 2019.05.05
이진 탐색 vs 이진 탐색 트리  (0) 2019.04.30
최단 경로  (0) 2019.04.28
그리디 알고리즘  (0) 2019.04.28