data structure 2

25
자료구조 세미나 그래프

Upload: yonsei

Post on 20-Jul-2015

1.076 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: Data Structure 2

자료구조 세미나

그래프

Page 2: Data Structure 2

그래프의 정의

• 그래프는 정점과 각 정점을 이어주는 간선으로 이루어진다 .

• G = { V, E }

– V 는 정점 (vertex) 의 집합

– E 는 간선 (edge) 의 집합

서울

인천

대전

강릉

부산

Page 3: Data Structure 2

구현

• 인접 리스트

• 인접 행렬

• 링크드 리스트 - 생략

Page 4: Data Structure 2

인접 리스트

• 같은 간선에 연결된 정점을 나열하는 방법 .

• (1,2), (2,3), (3,1) 과 같이 나타낸다 .

• 데이터의 크기가 간선의 수에 비례 .

• 불필요한 메모리 사용이 적음 .

• 간선 정보를 찾기가 쉽지 않음 .

Page 5: Data Structure 2

인접 행렬

• 두 정점을 연결하는 간선의 정보를 저장하여 그래프를 나타내는 방법 .

• 데이터의 크기가 크고 정점의 수의 제곱에 비례 .

• 간선 정보를 찾기가 편리 .

• 그래프를 구현할 때 일반적으로 사용되는 방법 .

• 이차원 배열 사용 .

Page 6: Data Structure 2

인접 행렬

• 다음 인접 행렬은 0->1, 1->2, 2->0 인 간선이 존재함을 보인다 .

/ 0 1 2

0 0 1 0

1 0 0 1

2 1 0 0

Page 7: Data Structure 2

그래프 탐색

• DFS 나 BFS 방법을 사용해 그래프를 탐색할 수 있음 .

• 두 정점 사이의 최단 거리 탐색 문제 .

• TSP 문제 .

Page 8: Data Structure 2

문제 1

• 모든 간선의 길이가 1 일 때 , 두 정점 간의 최단 거리를 구하는 방법은 ?

Page 9: Data Structure 2

문제 2

• 모든 간선의 길이가 서로 다를 수 있을 때 , 두 정점 간의 최단 거리를 구하는 방법은 ?

Page 10: Data Structure 2

문제 1 방법

• BFS 를 이용

• 가장 먼저 도착하는 경로가 최단 경로

Page 11: Data Structure 2

문제 2 방법

• BFS 나 DFS 를 이용

• 각 정점까지의 최단 거리를 갱신해가면서 문제를 푼다 .

• 알고리즘을 사용

Page 12: Data Structure 2

최단 경로 알고리즘

• Dijkstra Algorithm – O(n2)

• Floyd Algorithm – O(n3)

Page 13: Data Structure 2

Dijkstra

• 어떤 부분 그래프에서 인접한 다른 정점들까지의 최단 거리를 갱신해가는 방법

• 출발점에서 각 정점 간의

최단 거리를 구함 .

부분 그래프

Page 14: Data Structure 2

Floyd

• 동적계획법을 사용

• 그래프가 인접행렬로 구현됐을 시 구현이 간단

• 모든 정점 간의 최단 거리를 구한다 .

• 현재 a->b 의 비용이 a->c, c->b 두 비용을 합한 것 보다 크다면 갱신해주는 것이 좋다 .

Page 15: Data Structure 2

Floyd

for k = 1 to n

for i = 1 to n

for j = 1 to n

new ← g[i][k]+g[k][j]

if g[i][j] > new then

g[i][j] = new

• k, i, j 순서가 바뀌면 성립하지 않음

Page 16: Data Structure 2

자료구조 세미나

트리

Page 17: Data Structure 2

트리의 정의

• 사이클이 없는 그래프

• 즉 , 트리 T ∈ G

• 사이클은 간선을 중복해 사용하지 않고 어떤 정점에서 출발하여 다시 그 정점으로 돌아올 수 있는 경로를 말한다 .

12

34

이것은 트리가 아니다 .

Page 18: Data Structure 2

신장트리

• 그래프에서 사이클을 만들지 않고 V-1 개 만큼의 간선을 선택하여 만든 트리를 신장트리 라고 한다 .

• 이 중에서도 간선에 가중치가 있을 때 이 가중치의 합을 최소로 한 신장 트리를 최소신장트리 라 한다 .

Page 19: Data Structure 2

최소신장트리

• Kruskal

– 가장 쉽게 최소신장트리를 만들 수 있는 방법이다 .

– 간선을 가중치 순으로 정렬하여 사이클을 만들지 않으면서 작은 가중치를 가진 간선을 차례로 선택한다 .

Page 20: Data Structure 2

최소신장트리

• Prim

– Dijkstra 와 매우 유사한 방법이다 .

– 부분 최소신장트리에서 뻗어나갈 수 있는 가장 가까운 노드를 계속 선택해 나가는 방법

– 사이클이 만들어지지 않으므로 체크할 필요가 없음 .

Page 21: Data Structure 2

트리의 구현

• 링크드 리스트를 사용한 방법

• 배열을 사용한 방법

– 간단한 구현에 용이함 .

– 완전트리 구현에 용이함 .

Page 22: Data Structure 2

이진트리

• 각 노드 ( 트리에서는 정점이 아닌 노드라 한다 ) 가 최대 두개의 자식을 갖는 트리

• 배열을 사용해 간단하게 구현할 수 있다 .

• 배열의 1 번째 원소를 루트로 하고 , 각 노드의 n*2 를 왼쪽 자식 노드 , n*2+1 을 오른쪽 자식 노드로 한다 . 부모 노드는 n/2 가 된다 .

Page 23: Data Structure 2

이진트리

1 2 3 4 5 6 7 8 9 10 11

1

2 3

4 5 6 7

8 9 10 11

Page 24: Data Structure 2

이진검색트리

• 이진트리의 조건을 만족하면서 왼쪽 자식 노드의 값이 오른쪽 자식 노드의 값보다 크거나 작은 트리 .

• 자료를 빠르게 찾을 수 있음 . - O( log n )

– 하지만 트리가 잘못 생성될 경우 O( n )

– 이를 보완하기 위해 AVL 트리나 RB 트리 등을 사용한다 .( skip )

Page 25: Data Structure 2

• 이진트리의 조건을 만족하면서 부모 노드의 값이 자식 노드의 값 보다 크거나 작은 트리

• 완전이진트리의 조건도 만족함

• 부모 노드의 값은 항상 최대값이나 최소값을 가짐

• 갱신되는 최대 최소값을 빠르게 찾기 위해 쓰임