JUINTINATION

깊이우선탐색(DFS)과 너비우선탐색(BFS) 본문

자료구조 및 알고리즘

깊이우선탐색(DFS)과 너비우선탐색(BFS)

DEOKJAE KWON 2023. 1. 15. 17:53
반응형

그래프(Graph)란?

연결되어 있는 객체 간의 관계를 표현하는 자료구조

그래프 G(V, E)로 표시

  • 정점(vertices)
    • 여러 가지 특성을 가질 수 있는 객체
    • 노드(node)라고도 불림
  • 간선(edge)
    • 정점들 간의 관계
    • 링크(link)라고도 불림

DFS란?

  • 깊이 우선 탐색(depth-first search)한 방향으로 갈 수 있을 때까지 가다가 더 이상 갈 수 없게 되면 가장 가까운 갈림길로 돌아와서 이 곳으로부터 다른 방향으로 다시 탐색 진행
  • 스택(Stack)을 사용하거나 재귀함수 사용
# 재귀함수를 사용한 DFS
depth_first_search(v):
	v를 방문되었다고 표시;
		for all u ∈ (v에 인접한 정점) do 
			if (u가 아직 방문되지 않았으면)
				then depth_first_search(u)

# 스택을 사용한 DFS
dfs_iterative(G, v):
	스택 S를 생성한다. 
	S.push(v)
	while (not is_empty(S)) do 
		v = S.pop()
		if (v가 방문되지 않았으면)
			v를 방문되었다고 표시
			for all u ∈ (v에 인접한 정점) do
				if (u가 아직 방문되지 않았으면)
					S.push(u)
  • 장점
    • 단지 현 경로상의 노드들만을 기억하면 되므로 저장공간의 수요가 비교적 적다.
    • 목표노드가 깊은 단계에 있을 경우 해를 빨리 구할 수 있다.
  • 단점
    • 해가 없는 경로에 깊이 빠질 가능성이 있다.
    • 얻어진 해가 최단 경로가 된다는 보장이 없다. 이는 목표에 이르는 경로가 다수인 문제에 대해 깊이우선 탐색은 해에 다다르면 탐색을 끝내버리므로, 이때 얻어진 해는 최적이 아닐 수 있다는 의미이다.

BFS란?

  • 너비 우선 탐색(breadth-first search)
  • 시작 정점으로부터 가까운 정점을 먼저 방문하고 멀리 떨어져 있는 정점을 나중에 방문하는 순회 방법
  • 큐(Queue)를 사용하여 구현됨
# 큐를 사용한 BFS
breadth_first_search(v):
	v를 방문되었다고 표시
	큐 Q에 정점 v를 삽입
	while (Q가 공백이 아니면) do 
		Q에서 정점 w를 삭제
		for all u ∈ (w에 인접한 정점) do 
			if (u가 아직 방문되지 않았으면)
				then u를 큐에 삽입, u를 방문되었다고 표시
  • 장점
    • 출발노드에서 목표노드까지의 최단 길이 경로를 보장한다.
  • 단점
    • 경로가 매우 길 경우에는 탐색 가지가 급격히 증가함에 따라 보다 많은 기억 공간을 필요로 하게 된다.
    • 해가 존재하지 않는다면 유한 그래프(finite graph)의 경우에는 모든 그래프를 탐색한 후에 실패로 끝난다.
    • 무한 그래프(infinite graph)의 경우에는 결코 해를 찾지도 못하고, 끝내지도 못한다.

 

728x90

'자료구조 및 알고리즘' 카테고리의 다른 글

힙(Heap)과 우선순위 큐(Priority Queue)  (0) 2023.07.23
트리(Tree)  (0) 2023.01.15
동적 계획법(dynamic programming)  (0) 2022.07.16
덱(Deque)  (0) 2022.07.01
큐(Queue)  (0) 2022.07.01
Comments