Algorithm/자료구조

그래프(Graphs)

Jshrewd 2022. 6. 7. 16:13
728x90

그래프는 (Vertex, Edge)로 이루어진 쌍이다.

- V는 정점이라고 하는 노드 집합이다. (Vertex 라고 부름)

- E는 정점 쌍들의 집합으로, Edge(간선)라고 부른다.

- 정점과 간선은 위치 및 저장 요소이다.

 

Edge Types(간선 종류)

1. Directed Edge

- 순서 있는 정점 쌍 (u,v)  [ (u,v)와 (v,u)는 다름. 방향성이 존재하기 때문 ]

- 첫번째 정점 u는 원점이다.

- 두번째 정점 v는 목적지이다.

2. Undirected Edge

- 순서 없는 정점 쌍 (u,v) [ (u,v)와 (v,u(는 같음. 방향성이 존재하지 않기 때문]

3. Directed Graph

- 모든 간선이 directed인 경우.

4. Undirected Graph

- 모든 간선이 Undirected인 경우.

 

그래프 응용 프로그램에는 전류 순환(집적 회로) , 운송 네트워크(고속도로) , 컴퓨터 네트워크(인터넷) , 데이터베이스(ERD)등이 있다.

 

Terminology

끝 정점(end vertex or endpoints) - U와 V는 a의 끝 정점이다.

Incident - a,d,b는 V에 대해 incident 하다. ( 간선과 vertex가 붙어있을 때)

adjacent - U와 V는 adjacent 하다. ( 하나의 엣지로 연결되었을 때)

Degree(차수) - X의 Degree는 5이다. incident한 간선의 수를 세면 됨.

Parallel edges - h와 i는 parallel edge이다.

self-loop - j는 self loop.

 

Path - 교차하는 정점과 간선의 순서. 시작 vertex와 끝 vertex로 이루어진다.

Simple Path - 모든 정점과 간선이 구별되는 경로. 즉, 중복되는 vertex가 없는 경우를 말한다.

Ex. P1 = (V,b,X,h,Z)는 simple Path이다.

      P2 = (U,c,W,e,X,g,Y,f,W,d,V)는 simple Path가 아니다.

 

Cycle - 정점과 간선이 교차하는 원형 시퀀스이다. 즉, 시작 vertex로 다시 돌아오는 것을 말한다.

Simple Cycle - 모든 정점과 간선이 중복되지 않도록 순환한다.

Ex. C1 = (V,b,X,g,Y,f,W,c,U,a,V)는 simple cycle이다.

      C2 = (U,c,W,e,X,g,Y,f,W,d,V,a,U)는 simple cycle이 아니다.

 

그래프의 속성

n = 정점의 수

m = 간선의 수

deg(v) = 정점 v의 차수

1. 모든 정점의 차수의 합은 2m이다. ( 각 간선은 두번씩 count 되기 때문이다. )

2. 방향성이 없고(undirected) self-loop가 존재하지 않고, Parallel edge가 없는 그래프에서 m<= n(n-1)/2 이다. (각 정점은 최대 (n-1)의 차수를 가지기 때문이다.

 

Graph ADT

Vertex & edge - 위치 정보와 요소를 저장한다.

 

Accessor methods

e.endVertices() - 양 끝 정점 2개를 리턴한다.

e.opposite(v) - 반대편 정점을 찾는데 사용한다.

u.isAdjacentTo(v) - u와 v가 adjacent라면 true를 리턴한다.

*v - 정점 v와 관련된 element를 참조한다.

*e - 간선 e와 관련된 element를 참조한다.

 

Update methods ( 지우는 기능이 어렵다. )

insertVertex(o) - 정점 저장 요소 o를 삽입한다.

insertEdge(v,w,o) - 간선(v,w) 저장 요소 o를 삽입한다.

eraseVertex(v) - 정점 v(그리고 정점과 incident한 간선)을 제거한다.

eraseEdge(e) - 간선 e를 제거한다.

 

Iterable Collection methods

v.incidentEdges() - v와 연결된 간선을 모두 리턴한다.

vertices() - 그래프에 모든 정점 목록을 리턴한다.

edges() - 그래프에 모든 간선을 리턴한다.

 

Edge List Structure

정점 객체

- element

- 정점 시퀀스의 위치를 참조

간선 객체

- element

- 시작 정점 객체

- 도착 정점 객체

- 간선 시퀀스의 위치를 참조

정점 시퀀스

- 정점 객체의 시퀀스

간선 시퀀스

- 간선 객체의 시퀀스

 

Adjacency List Structure(인접 리스트 구조)

- 간선 리스트 구조

- 각 정점에 대한 Incidence Sequence가 추가됨. (벡터를 많이 사용함)

- 인접한 간선에 대한 간선 객체를 참조하는 시퀀스

- Augmented Edge objects

- 끝 정점의 incidence sequence의 위치를 참조한다.

 

Adjacency Matrix Structure(인접 행렬 구조)

- 간선 리스트 구조

- Augmented vertex object

- 정점과 연관된 정수 키(인덱스)

- 2D 배열 인접 배열

- 인접 정점에 대한 간선 객체 참조

- 인접하지 않은 정점의 경우 NULL 값

- old fashioned 버전의 경우 간선이 없으면 0 간선이 있으면 1. (요즘 버전에서는 주솟값을 저장)

 

Performance(성능)

728x90