-그래프 탐색 알고리즘 : DFS/BFS
탐색(Search)이란 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정을 말한다.
대표적인 그래프 탐색 알고리즘으로는 DFS와 BFS가 있다.
DFS/BFS는 코딩 테스트에서 매우 자주 등장하는 유형이다.
-미리 알아둬야할 알고리즘
스택 : 후입선출
큐 : 선입선출
재귀 함수 : 자기 자신을 다시 호출하는 함수 / 스택을 사용해야 할 때 함수를 연속적으로 호출하면 컴퓨터 메모리 내부의 스택 프레임에 쌓이기 때문에 구현상 스택 라이브러리 대신에 재귀 함수를 이용하는 경우가 많다. 그러므로 DFS 구현 시 재귀함수를 자주 사용한다.
-DFS (Depth - First Search) 깊이 우선 탐색
깊은 부분을 우선적으로 탐색하는 알고리즘이다. DFS는 스택 자료구조(혹은 재귀 함수)를 이용하며, 구체적인 동작 과정은 다음과 같다.
- 탐색 시작 노드를 스택에 삽입하고 방문 처리를 한다.
- 스택의 최상단 노드에 방문하지 않은 인접한 노드가 하나라도 있으면 그 노드를 스택에 넣고 방문처리한다. 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼낸다.
- 더 이상 2번의 과정을 수행할 수 없을 때까지 반복한다.
-DFS 소스코드 예제(python)
#각 노드가 연결된 정보를 표현한다.(인덱스 1부터 계산하는게 편해서 0번 인덱스는 비워둔다.)
graph = [[],[2,3,8],[1,7],[1,4,5],[3,5],[3,4],[7],[2,6,8],[1,7]]
#각 노드가 방문된 정보를 표현한다.
visited = [False] * 9
def dfs(graph, v, visited):
#현재 노드를 방문처리한다.
visited[v] = True
print(v, end=' ')
#현재 노드와 연결된 다른 노드를 재귀적으로 방문한다.
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
dfs(graph, 1, visited)
-BFS (Breadth - First Search) 너비 우선 탐색이며, 가까운 노드부터 우선적으로 탐색하는 알고리즘이다.
BFS는 큐 자료구조를 이용하며, 구체적인 동작은 다음과 같다.
- 탐색 시작 노드를 큐에 삽입하고 방문 처리를 한다.
- 큐에서 노드를 꺼낸 뒤 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모두 큐에 삽입 처리한다.
- 더 이상 2번의 과정을 수행할 수 없을 떄까지 반복합니다.
-BFS 소스코드 예제
from collections import deque
#각 노드가 연결된 정보를 표현한다.(인덱스 1부터 계산하는게 편해서 0번 인덱스는 비워둔다.)
graph = [[],[2,3,8],[1,7],[1,4,5],[3,5],[3,4],[7],[2,6,8],[1,7]]
#각 노드가 방문된 정보를 표현한다.
visited = [False] * 9
def bfs(graph, start, visited):
queue = deque([start])
#현재 노드를 방문처리한다.
visited[start] = True
#큐가 빌 때까지 반복
while queue:
v = queue.popleft()
print(v, end=' ')
#방문하지 않은 원소들을 큐에 삽입
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
bfs(graph, 1, visited)
출처 : [한빛미디어] 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저)
'Computer Science(cs 지식)' 카테고리의 다른 글
[운영체제] 병행 프로세스, 상호배제와 동기화, 임계영역 (0) | 2021.11.11 |
---|---|
포인터 참조 값 변환? (0) | 2021.11.07 |
[운영체제] 파일과 파일시스템 (0) | 2021.11.04 |
[운영체제]디스크 구조와 스케줄링 (0) | 2021.10.28 |
[운영체제]프레임 할당, 프로세스 적재, 기타 이슈 (0) | 2021.10.28 |