Data Structures and Algorithms (9)

3682 단어 AlgorithmsAlgorithms

Data Structure and Algorithms (9)

1. 그래프 (Graph)

그래프(Graph)란?
실제 세계 현상이나 사물을 정점(Vertex) 또는 노드(Node)와 간선(Edge)으로 표현하기 위해 사용

그래프(Graph) 관련 용어

  • 노드(Node) : 위치를 말함, 정점(Vertex)라고도 함
  • 간선(Edge) : 위치간의 관계를 표시한 선으로 노드를 연결한 선이라고 보면 됨 (= link, branch)
  • 인접정점(Adjacent Vertex) : 간선으로 직접 연결된 정점 (또는 노드)

참고용어

  • 정점의 차수 (Degree) : 무방향 그래프에서 하나의 정점에 인접한 정점의 수
  • 진입 차수 (in-Degree) : 방향 그래프에서 외부에서 오는 간선의 수
  • 진출 차수 (Out-Degree) : 방향 그래프에서 외부로 향하는 간선의 수
  • 경로 길이 (Path Length) : 경로를 구성하기 위해 사용된 간선의 수
  • 단순 경로 (Simple Path) : 처음 정점과 끝 정점을 제외하고 중보고딘 정점이 없는 경로
  • 사이클 (Cycle) : 단순 경로의 시작 정점과 종료 정점이 동일한 경우

그래프 종류
1) 무방향 그래프 (Undirected Graph)

  • 방향이 없는 그래프
  • 간선을 통해 노드는 양방향으로 갈 수 있음
  • 보통 노드 A, B가 연결되어있을 경우, (A,B) 또는 (B,A)로 표기

2) 방향 그래프 (Directed Graph)

  • 간선에 방향이 있는 그래프
  • 보통 노드 A,B가 A -> B로 가는 간선으로 연결되어있을 경우, <A,B> 로 표기 반대의 경우 <B,A>

3) 가중치 그래프 (Weighted Graph) 또는 네트워크 (Network)

  • 간선에 비용 또는 가중치가 할당된 그래프

4) 연결 그래프 (Connected Graph)와 비연결 그래프 (Disconnected Graph)

  • 연결 : 무방향 그래프에있는 모든 노드에 대해 항상 경로가 존재하는 경우
  • 비연결 : 무방향 그래프에서 특정 노드에 대해 경로가 존재하지 않는 경우

5) 사이틀 (Cycle)과 비순환 그래프 (Acyclic Graph)
사이틀 : 단순 경로의 시작 노드와 종료 노드가 동일한 경우
비순환 : 사이클이 없는 그래프

6) 완전 그래프 (Complete Graph)
그래프의 모든 노드가 서로 연결되어있는 그래프

그래프와 트리의 차이
트리는 그래프에 속한 특별한 종류




2. BFS vs DFS

대표적인 그래프 탐색 알고리즘

  • 너비 우선 탐색 (Breadth First Search) : 정점들과 같은 레벨에 있는 노드들 (형제노드)을 먼저 탐색하는 방식
  • 깊이 우선 탐색 (Depth First Search) : 정점의 자식들을 먼저 탐색하는 방식

파이썬으로 그래프 표현

1) 너비 우선 탐색 (Breadth First Search)

BFS 알고리즘 구현

  • visited (큐)
  • need_visit (큐)

code

def bfs(graph, start_node): 
  visited = list()
  need_visit = list()
ㅤ
  need_visit.append(start_node)
ㅤ
  while need_visit:
    node = need_visit.pop(0)
    if node not in visited:
      visited.append(node)
      need_visit.extend(graph[node]) // 데이터를 붙일 수 있음
ㅤ
  return visited
------------------------------------------------
bfs(graph, 'A')

시간 복잡도
일반적인 BFS 시간 복잡도
노드 수 : V
간선 수 : E
위 코드에서 while need_visit은 V+E번만큼 수행
시간 복잡도 : O (V+E)

2) 깊이 우선 탐색 (Depth First Search)
DFS 알고리즘 구현

  • visited (큐)
  • need_visit (스택)

code

def dfs(graph, start_node): 
  visited = list()
  need_visit = list()
ㅤ
  need_visit.append(start_node)
ㅤ
  while need_visit:
    node = need_visit.pop()
    if node not in visited:
      visited.append(node)
      need_visit.extend(graph[node]) // 데이터를 붙일 수 있음
ㅤ
  return visited
------------------------------------------------
dfs(graph, 'A')

시간 복잡도
일반적인 DFS 시간 복잡도
노드 수 : V
간선 수 : E
위 코드에서 while need_visit은 V+E번만큼 수행
시간 복잡도 : O (V+E)

pop(0) = 큐처럼
pop() = 스택처럼

본 게시글은 fastcampus 이준희강사 수업을 듣고 개인적으로 정리한 내용임을 밝힘.

좋은 웹페이지 즐겨찾기