자료구조 강의노트 -...

22
소프트웨어학과 원성현 교수 1 자료구조 강의노트 교재 : C배우는 쉬운 자료구조(개정판) 출판사 : 한빛미디어(20113발행) 저자 : 이지영

Upload: others

Post on 02-Sep-2019

0 views

Category:

Documents


0 download

TRANSCRIPT

소프트웨어학과 원성현 교수 1

자료구조 강의노트

교재 : C로 배우는 쉬운 자료구조(개정판) 출판사 : 한빛미디어(2011년 3월 발행) 저자 : 이지영

소프트웨어학과 원성현 교수 132

9장 그래프

소프트웨어학과 원성현 교수 133

1. 그래프의 구조

• 그래프란? • 연결되어 있는 객체간의 관계를 표현할 수 있는 자료구조 • 일상생활에서의 예

• 지하철 노선 • 전국의 고속도로망

• 컴퓨터시스템에서의 예 • 회로의 연결 구조 또는 프로세스와 자원간의 연결 구조

• 정의 : 정점 V와 간선 E의 쌍으로 이루어진 유한집합 • 그래프로 표현할 수 있는 것

• 도로 • 도로의 교차점, 양방통행길, 일방통행길을 관리하기 위한 도로정보시스템 구현에 적용.

• 학사관리시스템 • 대학에서 선수과목 이수여부를 확인하는 시스템에 적용 가능

그래프 개요

소프트웨어학과 원성현 교수 134

B

A

C

D

a b

c d

e

f

g

Kneiphof

Königsberg

Pregel River

a b

c d e

f

g

A

B

C

D

• 그래프의 역사 • 1736년, 스위스의 수학자 오일러가 창시자

• 닫힌 한붓그리기(오일러 그래프) • 모든 꼭짓점의 차수가 짝수

• 한붓그리기 • 차수가 홀수 인 꼭지점

의 수가 0 또는 2개

소프트웨어학과 원성현 교수 135

그래프의 종류

• 무방향 그래프(undirected graph) • 밑의 그래프 G1과 같이 간선에 방향 표시가 없어서 양 방향으로의 이동이 가능한 그래프. 양방 통행길과 같은 의미

• 방향 그래프(directed graph) • 밑의 그래프 G2와 같이 간선에 방향 표시가 있어서 표시된 방향으로만의 이동이 가능한 그래프. 일방 통행길과 같은 의미.

1

3

0

2

G1

0

2

1

3

G2

소프트웨어학과 원성현 교수 136

• 완전 그래프(complete graph) • 밑의 그래프 G3과 같이 그래프를 구성하는 모든 정점들이 상호 연결된 그래프. • 정점의 개수가 n이라면 간선의 수는 반드시 n × (n-1)/2개

• 부분 그래프(sub graph) • 그래프 G(밑의 그래프 G3)를 구성하는 정점의 집합 V(G)와 간선의 집합 E(G)의 부분 집합으로 이루어진 그래프(밑의 그래프 G4)

G3

1

3

0

2

G4

1

3

0

2

소프트웨어학과 원성현 교수 137

• 가중 그래프(weight graph) • 간선에 가중치를 포함하는 그래프로 네트웍(network)이라고도 함 • 가중치란 두 정점간에 부여된 비용으로 시간, 노력, 거리 등을 의미할 수 있으며 대표적인 예로 고속도로의 톨게이트간 거리를 생각할 수 있음 • 밑의 그래프 G5와 같은 그래프

G5

0 1 2

3 4 5

45

50 10

10 20

15

20

15 3

35

30

소프트웨어학과 원성현 교수 138

• 연결 그래프(connected graph) • 밑의 그래프 G1과 같이 그래프를 구성하는 모든 정점들이 최소한 1개 이상의 정점들과 상호 연결된 그래프

• 비 연결 그래프(unconnected graph) • 그래프를 구성하는 정점 중 다른 어떤 정점과도 연결되지 않은 정점을 포함하는 그래프. 밑의 그래프 G6의 경우를 말함

G1

1

3

0

2 G6

1

3

0

2

소프트웨어학과 원성현 교수 139

그래프 관련 용어

• 정점(vertex) • 여러 기능을 수행할 수 있는 객체로 밑의 그래프 G1의 경우, 0, 1, 2, 3을 의미하는데 이를 집합으로 V(G1) = {0, 1, 2, 3}으로 나타내기도 함

• 간선(edge) • 정점들간의 관계로 밑의 그래프 G1의 경우, E(G1) = {(0, 1), (0, 2), (0, 3), (1, 2)}로 나타내기도 함

1

3

0

2

G1

소프트웨어학과 원성현 교수 140

• 인접 정점(adjacent vertex) • 특정 간선에 의해 직접 연결된 정점. 밑의 그래프 G1에서, 정점 0의 인접 정점은 정점 1, 2, 3임

• 차수(degree) • 특정 정점에 인접한 정점의 수. 밑의 그래프 G1에서 정점 0의 차수는 3. 단, 무방향 그래프에 한함

• 진입 차수(in-degree) 및 진출 차수(out-degree) • 방향 그래프에서 진입 차수는 특정 정점으로 진입되는 간선의 수이고, 진출 차수는 특정 정점에서 진출되는 간선의 수

1

3

0

2

G1

CS1 CS2

CS3

CS7 CS5

CS4

CS8 CS6

G7

소프트웨어학과 원성현 교수 141

• 경로(path) • 두개의 정점 사이에 간선이 존재하는 경우, 정점의 나열 • 예 : (3, 0, 1)

• 단순 경로(simple path) • 경로 상에 반복되는 경로가 없는 경로 • 예 : (0, 1, 2)

• 싸이클(cycle) • 시작 정점과 끝 정점이 일치되는 경로 • 예 : (0, 1, 2, 0)

G1

1

3

0

2

소프트웨어학과 원성현 교수 142

2. 그래프의 구현

• 그래프를 표현하기 위해 배열을 이용하며, 간선이 있는 경우에는 1, 없는 경우에는 0으로 배열의 값을 정의함

순차 자료구조를 이용한 그래프의 구현 : 인접행렬

G8

1

3

0

2

[0] [1] [2] [3]

[0] 0 1 1 1

[1] 1 0 1 0

[2] 1 1 0 1

[3] 1 0 1 0

소프트웨어학과 원성현 교수 143

• 그래프를 표현하기 위해 연결 리스트를 이용하며, 그래프를 구성하는 정점을 연결 리스트의 헤드 노드로 구성하고, 간선이 있는 정점을 하위 노드로 구성

연결 자료구조를 이용한 그래프의 구현 : 인접리스트

G8

1

3

0

2

0

1

2

3

1 2 3

0 2

0 1 3

0 2

소프트웨어학과 원성현 교수 144

3. 그래프 순회

• 깊이 우선 탐색(DFS, Depth First Search) • 그래프의 한 정점을 시작 정점 v로 지정한 후, v부터 방문한 다음, v의 인접 정점 중 방문하지 않은 정점으로 이동하여 방문하면서 더 이상 방문하지 않은 정점이 없을 때까지 탐색 작업을 반복하는 방법

깊이우선탐색

G9

0

1 2

3 4 5 6

7

DFS

0

1 2

3 4 5 6

7

소프트웨어학과 원성현 교수 145

• 깊이 우선 탐색 알고리즘

DFS(v) for(i=0; i<n; i=i+1) do { visited[i]=false; } stack=createStack(); visited[v]=true; v 방문; while(not isEmpty(stack)) do { if(visited[v의 인접정점 w]=false) then { push(stack,v); visited[w]=true; w 방문; v=w; } else v=pop(stack); } End DFS()

소프트웨어학과 원성현 교수 146

• 너비 우선 탐색(BFS, Breadth First Search) • 그래프의 한 정점을 시작 정점 v로 지정한 후, v부터 방문한 다음, v의 모든 인접 정점을 방문한 후 더 이상 방문하지 않은 정점이 없는 경우, 멀리 떨어져 있는 정점을 방문하는 방법

너비우선탐색

G1

0

1 2

3 4 5 6

7

0

1 2

3 4 5 6

7

BFS

소프트웨어학과 원성현 교수 147

• 너비 우선 탐색 알고리즘

BFS(v) for(i=0; i<n; i=i+1) do { visited[i]=false; } Q=createQueue(); visited[v]=true; v 방문; while(not isEmpty(Q)) do { while(visited[v의 인접 정점 w]=false) do { visited[w]=true; w 방문; enQueue(Q,w); } v=deQueue(Q); } end BFS()

소프트웨어학과 원성현 교수 148

4. 신장트리와 최소비용 신장트리

• 신장 트리(spanning tree)란? •그래프 내의 모든 정점을 포함하기 위해 운행한 결과

신장트리

G9

0

1

2

3 4

0

1

2

3 4

0

1

2

3 4

0

1

2

3 4

소프트웨어학과 원성현 교수 149

• 최소 비용 신장 트리(minimal cost spanning tree)란? • 그래프 내의 모든 간선에 비용이 부여된 상태에서 비용을 최소화하는 방법으로 구성된 신장 트리

• 대표적인 최소 비용 신장 트리 알고리즘 • Kruscal’s Algorithm

• 그래프를 구성하는 간선 중 비용이 가장 적은 순서로 선택하되 싸이클은 배제

• Prime’s Algorithm • 시작 정점이 주어지고 그 정점으로부터 연결된 간선 중 비용이 적은 간선을 선택하는 방법

최소비용 신장트리

소프트웨어학과 원성현 교수 150

0 1

2

3

4

5 6

10

25

28

14 16

24

22

18 12

0 1

2

3

4

5 6

0

2

3

4

5 6

10 0

2

3

4

5 6

10

12

0

2

3

4

5 6

10

12

1 1

1 14

0

2

3

4

5 6

10

12

1

14 16

0

2

3

4

5 6

10

12

1

14 16

22

0

2

3

4

5 6

10

12

1

14 16

22

25

• Kruscal’s Algorithm

소프트웨어학과 원성현 교수 151

• Prime’s Algorithm

0 1

2

3

4

5 6

0

2

3

4

5 6

10 1

0

2

3

4

5 6

10

12

1

14 16

22

25

0 1

2

3

4

5 6

10 10

25 25

22

0

2

3

4

5 6

10

12

1

25

22

0

2

3

4

5 6

10

12

1

25

22

16

소프트웨어학과 원성현 교수 152

• 최단 경로(shortest path)란? • 그래프의 모든 간선에 비용이 주어진 상태에서 특정 2개의 정점 사이를 잇는 모든 경로 중 비용이 가장 적은 경로

최단 경로

0 1 2

3 4 5

45

50 10

10 20

15

20

15 3

35

30

Path Length 0, 1 50 0, 3, 4, 1 45 0, 1, 2 60 0, 3, 4, 2 60 0, 2 45

0 1 2 3 4 5

0 × 50 45 10 × ×

1 × × 10 15 × ×

2 × × × × 30 ×

3 20 × × × 15 ×

4 × 20 35 × × ×

5 × × × × 3 ×