티스토리 뷰

- 아래의 영상을 보고 정리했다.
https://www.youtube.com/watch?v=WbP1KDXLgG4&list=PLrj92cHmwIMfxmffI2RSuSmWfmHvLksoB&index=47 


● Graph
1. 그래프의 구성요소
1). 정점(vertex) : 노드의 집합(Tree에서의 노드가 Graph에서는 정점이라고 불린다.)
2). 간선(edge) : 정점 쌍의 집합(각 노드 간의 길이라고 생각하면 된다.)
- 그래프는 정점과 간선 데이터 모두 저장해야 한다.

https://www.youtube.com/watch?v=WbP1KDXLgG4&list=PLrj92cHmwIMfxmffI2RSuSmWfmHvLksoB&index=47

2. 그래프 정점과 간선의 예
1). 구글 지도 : 각 위치는 정점으로, 경로는 간선으로 표시
2). 인스타 친구 : 각 사용자는 정점으로, 친구 관계는 간선으로 표시
3). 항공 운송망 : 각 공항은 정점으로, 항로는 간선으로 표시. 이를 바탕으로 가장 빠르거나 가장 저렴한 경로를 계산
 
2. 그래프의 종류
1). 무방향 그래프(= 양방향 그래프)
- 방향이 없는 간선을 갖는 그래프, 방향이 없기에 양쪽 방향으로 모두 이동할 수 있다.
- 간선의 방향이 없기 때문에 간선(x, y)는 간선(y, x)와 같다.

https://www.youtube.com/watch?v=WbP1KDXLgG4&list=PLrj92cHmwIMfxmffI2RSuSmWfmHvLksoB&index=47

 
2). 방향 그래프(= 단방향 그래프)
- 방향이 있는 간선을 갖는 그래프, 방향이 있기에 한쪽 방향으로만 이동할 수 있다.
- 간선의 방향이 있기 때문에 간선(x, y)는 간선(y, x)와 서로 다르다.
ex) 네비게이션이 안내해주는 일방통행 길

https://www.youtube.com/watch?v=WbP1KDXLgG4&list=PLrj92cHmwIMfxmffI2RSuSmWfmHvLksoB&index=47

 
3). 가중치 그래프와 비가중치 그래프
- 가중치 그래프 : 간선이 가중치를 갖는 그래프(weighted graph)
- 비가중치 그래프 : 간선에 가중치가 없는 그래프(unweighted graph)
- 비가중치 그래프라고 해서 간선의 가중치가 0 인것이 아니라 모두 동일하게 1 인 것이다.

https://www.youtube.com/watch?v=WbP1KDXLgG4&list=PLrj92cHmwIMfxmffI2RSuSmWfmHvLksoB&index=47

- 위 그림에서 (서울 ~ 부산)으로 직항으로 가는 길의 (가중치 = 7)이다.
- 이때 (서울 ~ 부산)으로 가는 길 중에 가중치가 낮은 경로를 찾는다면 (서울 ~ 대전 ~ 대구 ~ 부산)의 경로가 나온다.
ex) 가중치가 낮은 경로 = 가격이 저렴한 경로

(3 + 2 + 1 = 6 < 7)

 
4). 순환 그래프와 비순환 그래프
- 순환 그래프 : 하나 이상의 사이클을 갖는 그래프
- 비순환 그래프 : 사이클이 없는 그래프

https://www.youtube.com/watch?v=WbP1KDXLgG4&amp;list=PLrj92cHmwIMfxmffI2RSuSmWfmHvLksoB&amp;index=47

● Tree와 Graph
- 아직 Tree를 공부하지는 않았지만 간단하게 비교해보자
- Tree 구조는 단방향 이동만 가능하다.(단일경로만 존재)  ex) A노드에서 E노드로 가는 길은 오직 하나

https://www.youtube.com/watch?v=WbP1KDXLgG4&amp;list=PLrj92cHmwIMfxmffI2RSuSmWfmHvLksoB&amp;index=47

- Graph는 양방향 이동이 가능하다.(다양한 경로 존재)  ex) A노드에서 E노드로 가는 길은 여러가지

https://www.youtube.com/watch?v=WbP1KDXLgG4&amp;list=PLrj92cHmwIMfxmffI2RSuSmWfmHvLksoB&amp;index=47

- Tree 구조는 노드간 경로가 단일경로이기 때문에 노드에 대한 정보만 저장하면 된다.
- 정확히 말해 value 값, left 주소값, right 주소값만 저장하면 된다.(여기서 value는 노드에 대한 정보를 의미한다.)
- 그에 반해 Graph는 노드간의 경로가 다양하기 때문에 노드에 대한 정보와 함께 간선에 대한 정보도 저장해야 한다.
cf)
- 위의 그림을 기준으로 A노드는 B노드와 C노드로 갈 수 있는 간선이 있다.
- 위의 그림을 기준으로 B노드는 A노드와 C노드, D노드로 갈 수 있는 간선이 있다.


● Graph 구현 방식

1. 2차원 배열로 구현(adjacency matrix)
2. 연결 리스트로 구현(adjacency list)

 
 
1. 2차원 배열로 구현(adjacency matrix)
- 각 노드간 경로가 없으면 0, 경로가 있으면 각 간선의 가중치로 채워진다.
- N개의 정점을 가진 그래프의 이차원 배열의 크기는 N * N 으로 생성한다.
- 희소 그래프(간선의 수가 적은 그래프)의 경우 메모리가 낭비된다.
- 간선의 조회, 추가, 제거에는 O(1)의 시간이 걸린다. 공간 복잡도는 O(n^2)이다.

https://www.youtube.com/watch?v=WbP1KDXLgG4&amp;list=PLrj92cHmwIMfxmffI2RSuSmWfmHvLksoB&amp;index=47

- 위의 그림은 비가중치 그래프 & 무방향 그래프(양방향 그래프)를 나타낸 것이다.
- 그렇기에 오른쪽 표의 전체 합은 (간선 개수 * 2 = 8)이다.
- 비가중치 그래프에서 간선의 가중치는 모두 1 이다.
- 위의 그림은 정점이 4개이기에 (4*4 = 16바이트)의 메모리를 할당한 상태이다.
- 오른쪽의 표에서 행은 출발점(source), 열은 도착점(destination)을 의미한다.

https://www.youtube.com/watch?v=WbP1KDXLgG4&amp;list=PLrj92cHmwIMfxmffI2RSuSmWfmHvLksoB&amp;index=47

 
2. 연결 리스트로 구현(adjacency list)
- 2차원 배열로 구현하는 것의 단점을 보완, 공간(메모리)의 낭비를 막으며 효율적으로 그래프를 저장하는 방법
- 각 정점은 배열에 저장하고 간선의 가중치는 연결 리스트의 노드에 저장한다.
- adjacency list는 희소 그래프(간선의 수가 적은 그래프)를 표현하는데 좋다.

https://www.youtube.com/watch?v=WbP1KDXLgG4&amp;list=PLrj92cHmwIMfxmffI2RSuSmWfmHvLksoB&amp;index=47

- 위 그림을 기준으로 정점이 4개이기에 (length = 4)인 배열을 선언한 후 각 정점에서 갈 수 있는 정점들을(= 간선들을) 연결리스트로 묶는다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함