많은 양의 데이터 중에서 원하는 데이터를 찾는 과정을 말한다.
DFS와 BFS등을 꼽을 수 있다.
사실 DFS와 BFS를 이해하기 위해서 기본 자료구조인 스택과 큐, 재귀함수에 대한 이해가 전제되어야 한다.
자료구조란 데이터를 표현하고 관리하고 처리하기 위한 구조를 말한다.
스택과 큐는 삽입(Push)과 삭제(Pop)으로 구성된다.
(이 외에도 오버플로와 언더플로 등을 고려해야 한다)
선입후출, 후입선출 구조를 스택이라고 한다.
파이썬에서는 별도 라이브러리가 필요치 않고, append, pop메서드를 이용하면 스택과 동일하게 동작한다.
앞 뒤가 뚫려있는 선입선출구조를 말한다.
파이썬으로 구현할 때, collections 모듈에서 제공하는 deque자료구조를 활용한다.
append(), popleft() 메서드를 활용하자.
deque객체를 리스트 자료형으로 변경하고자 한다면 list()메서드를 이용하면 리스트 자료형이 반환된다.
자기 자신을 다시 호출하는 함수를 재귀함수라고 한다.
무한으로 반복되기 때문에 언제 끝나는지 종료 조건을 꼭 명시해야 한다.
재귀함수는 내부적으로 스택 자료구조와 유사하다.
그래프는 노드Node(정점Vertex), 간선Edge로 표현되며,
그래프 탐색이란 하나의 노드를 시작으로 다수의 노드를 방문하는 것을 말한다.
또한 두 노드가 간선으로 연결되어 있다면, 두 노드는 인접하다 라고 표현한다.
그래프는 크게 두 가지 방식으로 표현할 수 있다.
INF = 9999999
garph = [
[0, 7, 5],
[7, 0, INF],
[5, INF, 0]
]
# 행이 3개인 2차원 리스트로 인접 리스트 표현
graph = [[] for _in range(3)]
# 노드 0에 연결된 노드 정보 저장(노드, 거리)
graph[0].append((1,7))
graph[0].append((2,5))
인접 행렬 방식은 모든 관계를 저장하므로 노드 개수가 많을수록 메모리가 불필요하게 낭비된다. 반면 인접 리스트 방식은 연결된 정보만을 저장하기 때문에 메모리를 효율적으로 사용한다.
그러나 인접 리스트 방식은 이와 같은 속성 때문에 특정 두 노드가 연결되어 있는지 정보를 얻는 속도가 느리다.
따라서 특정 노드와 연결된 모든 인접 노드를 순회해야 하는 경우 인접 리스트 방식이 인접 행렬 방식에 비해 메모리 공간 낭비가 적다.
DFS는 Depth-First Search, 깊이 우선 탐색이라고도 부르며, 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘이다. (최대한 멀리 있는 노드부터 탐색) 데이터 개수가 N개인 경우, O(N)의 시간이 소요된다는 특징이 있다.
또한 스택을 이용하는 알고리즘이기 때문에 실제 구현은 재귀 함수를 이용했을 때 매우 간결하게 구현할 수 있다.
BFS는 Breadth First Search, 너비 우선 탐색이라는 의미를 가진다. 쉽게 말해 가까운 노드부터 탐색하는 알고리즘이다. 큐 알고리즘을 이용한다.
마찬가지로 데이터 개수가 N개인 경우, O(N)의 시간이 소요된다는 특징이 있다. 일반적인 경우 실제 수행 시간은 DFS보다 좋은 편이다.