DFS,BFS

사요·2021년 11월 7일
0

알튜비튜

목록 보기
12/16

모든 사진 자료에 관한 출처는 아래 알튜비튜 - 튜터링에 있음을 밝힙니다.
https://github.com/Altu-Bitu/Notice

🌐그래프

  • 정점과 그 정점을 연결하는 간선으로 이루어진 자료구조
  • 간선의 방향은 단방향(방향 그래프)나 양방향(무방향 그래프)로 나뉨
  • 간선에 가중치가 있을 수 있음

📚그래프 용어

  • degree(차수) : 무방향 그래프에서 정점에 연결된 간선의 수
  • 무방향 그래프의 총 차수(degree)의 합 -= 간선의 수 x 2 ex) 3+3+2+2=5x2
  • indegree : 방향 그래프에서 해당 정점으로 들어오는 간선의 수
  • outdegree : 방향 그래프에서 해당 정점에서 나가는 간선의 수
  • 방향 그래프의 총 차수(indegree,outdegree)의 합 = 간선의 수 -> 들어오거나 나가는 간선 중 하나만 count되기 때문!

🕎그래프 경로

  • 경로는 여러개일 수 있다.
  • 사이클(cycle) : 한 정점에서 다시 동일한 정점으로 돌아오는 경로 (ex. 3->2->4)

🔩그래프 구현

1. 인접행렬

  • 두 정점 간의 연결관계를 N*N 크기의 행렬(2차원배열)로 나타냄
  • 두 정점 i-j 간의 연결관계확인 : O(1)
  • 특정 노드와 연결되어 있는 모든 노드 확인 : O(N)
  • 공간 복잡도 : O(N2)
    -> 정점이 많아지면 사용불가 (메모리초과)

2. 인접리스트

  • 각 정점에 연결된 정점들을 리스트(1차원 배열)에 담아 보관
  • 두 정점 i-j 간의 연결 관계 확인 : O(min(degree(i),degree(j)) // i,j중 더 낮은 차수
  • 특정 노드(i)와 연결되어 있는 모든 노드 확인: O(degree(i)) //i의 차수 만큼.
  • 공간복잡도 : O(N + E) //정점의 수 + 간선의 수

Q. 왜 O(E)가 아니지?
A. 이차배열이라 그런가

인접행렬 vs 인접 리스트

인접행렬

  • 정점 사이의 연결 관계(간선)이 많을경우
  • 특정 정점과 정점의 연결 관계를 많이 확인해야 하는 경우

인접리스트

  • 정점 사이의 연결관계(간선)이 적은 경우
  • 연결된 정점들을 탐색해야 하는 경우

🔭그래프 탐색

DFS(깊이 우선 탐색)

  • 최대한 깊게 탐색 후 빠져 나옴
  • 한 정점을 깊게 탐색해서 빠져 나왔다면, 나머지 정점 계속 동일하게 탐색
  • 스택 (stack), 재귀 함수로 구현

BFS(너비 우선 탐색)

  • 자신의 자식들부터 순차적으로 탐색
  • 순차 탐색 이후, 다른 정점의 자식들 탐색
  • 큐(queue)로 구현

DFS,BFS 특징

  • 모든 노드를 방문하고자 하는 경우엔 DFS,BFS 상관 X
  • 가중치가 주어지거나 특정 경로를 찾아야 할때는 DFS
  • 두 노드 사이의 최단 거리를 찾을 때는 BFS(ex.미로찾기)
    -> BFS는 현재 노드에서 가장 가까운 곳(자식노드)부터 탐색하기 때문!
  • 그래프가 단방향으로 주어지는지, 양방향으로 주어지는지 잘 살펴보자!

📌대표문제

BOJ) 1260 :DFS와 BFS

미로

  1. BFS 풀이
  2. DFS 풀이

다른 미로를 살펴본다면 ...?

DFS의 3번째칸은 BFS의 3번째 칸보다 뒤처진다. 따라서 최단경로를 구하기 위해서는 반드시 BFS로 풀어야한다!

가능한 이동 경로의 개수

BFS,DFS 는 완전탐색 알고리즘이므로 시간초과. 따라서 DP배열을 적절하게 같이 활용하여 주어야함. DP배열에 목적지까지 도달하는 경우의수를 저장하자!

profile
하루하루 나아가는 새싹 개발자 🌱

0개의 댓글