data structure 2
TRANSCRIPT
자료구조 세미나
그래프
그래프의 정의
• 그래프는 정점과 각 정점을 이어주는 간선으로 이루어진다 .
• G = { V, E }
– V 는 정점 (vertex) 의 집합
– E 는 간선 (edge) 의 집합
서울
인천
대전
강릉
부산
구현
• 인접 리스트
• 인접 행렬
• 링크드 리스트 - 생략
인접 리스트
• 같은 간선에 연결된 정점을 나열하는 방법 .
• (1,2), (2,3), (3,1) 과 같이 나타낸다 .
• 데이터의 크기가 간선의 수에 비례 .
• 불필요한 메모리 사용이 적음 .
• 간선 정보를 찾기가 쉽지 않음 .
인접 행렬
• 두 정점을 연결하는 간선의 정보를 저장하여 그래프를 나타내는 방법 .
• 데이터의 크기가 크고 정점의 수의 제곱에 비례 .
• 간선 정보를 찾기가 편리 .
• 그래프를 구현할 때 일반적으로 사용되는 방법 .
• 이차원 배열 사용 .
인접 행렬
• 다음 인접 행렬은 0->1, 1->2, 2->0 인 간선이 존재함을 보인다 .
/ 0 1 2
0 0 1 0
1 0 0 1
2 1 0 0
그래프 탐색
• DFS 나 BFS 방법을 사용해 그래프를 탐색할 수 있음 .
• 두 정점 사이의 최단 거리 탐색 문제 .
• TSP 문제 .
문제 1
• 모든 간선의 길이가 1 일 때 , 두 정점 간의 최단 거리를 구하는 방법은 ?
문제 2
• 모든 간선의 길이가 서로 다를 수 있을 때 , 두 정점 간의 최단 거리를 구하는 방법은 ?
문제 1 방법
• BFS 를 이용
• 가장 먼저 도착하는 경로가 최단 경로
문제 2 방법
• BFS 나 DFS 를 이용
• 각 정점까지의 최단 거리를 갱신해가면서 문제를 푼다 .
• 알고리즘을 사용
최단 경로 알고리즘
• Dijkstra Algorithm – O(n2)
• Floyd Algorithm – O(n3)
Dijkstra
• 어떤 부분 그래프에서 인접한 다른 정점들까지의 최단 거리를 갱신해가는 방법
• 출발점에서 각 정점 간의
최단 거리를 구함 .
부분 그래프
Floyd
• 동적계획법을 사용
• 그래프가 인접행렬로 구현됐을 시 구현이 간단
• 모든 정점 간의 최단 거리를 구한다 .
• 현재 a->b 의 비용이 a->c, c->b 두 비용을 합한 것 보다 크다면 갱신해주는 것이 좋다 .
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 순서가 바뀌면 성립하지 않음
자료구조 세미나
트리
트리의 정의
• 사이클이 없는 그래프
• 즉 , 트리 T ∈ G
• 사이클은 간선을 중복해 사용하지 않고 어떤 정점에서 출발하여 다시 그 정점으로 돌아올 수 있는 경로를 말한다 .
12
34
이것은 트리가 아니다 .
신장트리
• 그래프에서 사이클을 만들지 않고 V-1 개 만큼의 간선을 선택하여 만든 트리를 신장트리 라고 한다 .
• 이 중에서도 간선에 가중치가 있을 때 이 가중치의 합을 최소로 한 신장 트리를 최소신장트리 라 한다 .
최소신장트리
• Kruskal
– 가장 쉽게 최소신장트리를 만들 수 있는 방법이다 .
– 간선을 가중치 순으로 정렬하여 사이클을 만들지 않으면서 작은 가중치를 가진 간선을 차례로 선택한다 .
최소신장트리
• Prim
– Dijkstra 와 매우 유사한 방법이다 .
– 부분 최소신장트리에서 뻗어나갈 수 있는 가장 가까운 노드를 계속 선택해 나가는 방법
– 사이클이 만들어지지 않으므로 체크할 필요가 없음 .
트리의 구현
• 링크드 리스트를 사용한 방법
• 배열을 사용한 방법
– 간단한 구현에 용이함 .
– 완전트리 구현에 용이함 .
이진트리
• 각 노드 ( 트리에서는 정점이 아닌 노드라 한다 ) 가 최대 두개의 자식을 갖는 트리
• 배열을 사용해 간단하게 구현할 수 있다 .
• 배열의 1 번째 원소를 루트로 하고 , 각 노드의 n*2 를 왼쪽 자식 노드 , n*2+1 을 오른쪽 자식 노드로 한다 . 부모 노드는 n/2 가 된다 .
이진트리
1 2 3 4 5 6 7 8 9 10 11
1
2 3
4 5 6 7
8 9 10 11
이진검색트리
• 이진트리의 조건을 만족하면서 왼쪽 자식 노드의 값이 오른쪽 자식 노드의 값보다 크거나 작은 트리 .
• 자료를 빠르게 찾을 수 있음 . - O( log n )
– 하지만 트리가 잘못 생성될 경우 O( n )
– 이를 보완하기 위해 AVL 트리나 RB 트리 등을 사용한다 .( skip )
힙
• 이진트리의 조건을 만족하면서 부모 노드의 값이 자식 노드의 값 보다 크거나 작은 트리
• 완전이진트리의 조건도 만족함
• 부모 노드의 값은 항상 최대값이나 최소값을 가짐
• 갱신되는 최대 최소값을 빠르게 찾기 위해 쓰임