관리 메뉴

제뉴어리의 모든것

[Section2][자료구조/알고리즘] 자료구조 - Graph 본문

코드스테이츠/정리 블로깅

[Section2][자료구조/알고리즘] 자료구조 - Graph

제뉴어리맨 2022. 7. 27. 19:52

그래프란?

여러개의 데이터들이 서로 복잡하게 연결되어 있는 데이터 구조.

일반적으로 알고 있는 수치를 나타내는 그래프와 컴퓨터 공학에서의 그래프는 무관하다.
구조를 그림으로 나타내면 마치 아래와 같다.

 

그림 1. 출처 : https://kasterra.github.io/graphds1/

위 그림에서 0, 1, 2, 3, 4, 5, 6 이 데이터들이다.

그래프에서 쓰이는 명칭으로는 정점(Vertex)라고 한다.

정점 사이에는 간선(Edge)이 존재해서 데이터간의 관계를 나타낸다.

즉, 간선이 존재하다는 것은 데이터간 연결이 되어있다는것이다.

그리고 그 간선은 방향성이 존재할 수도 있고(단방향), 없을수도 있다.(없을 경우는 양방향)

 

 

그래프의 표현 방법

위와 같은 그래프를 표현 할 수 있는 방법은 크게 두가지가 있다.

  • 인접 행렬
    그래프를 행렬로써 표현한 방법이다.
    인접 행렬의 의미는 인접한 내용 수치(1 or 0) 로써 담은 행렬이다.
    그렇다면 인접하다는 것은 무슨 의미일까?
    인접하다는 가까이 옆에 붙어 있는 것을 의미한다.
    그리고 그래프에서 가까이 옆에 붙어 있다는것은 간선이 존재한다는 의미이다.
    그러므로, 인접 행렬이란 간선이 내용을 수치로 나타낸 행렬이란 뜻이다.
    그 수치가 1이면 정점은 연결되어 있음을 나타내고, 0이면 연결되지 않았음을 나타낸다. 


그림 2.  출처 : https://sarah950716.tistory.com/12

 

그림 2 중 우측에 내용이 인접행렬이다.

정점이 4개 이므로 행렬의 크기는 행과 열이 4이다.

더 자세히 표현 하자면 아래와 같다.

 

      A   B   C   D

A    0   1    1   1

B    0   0    1   0

C    0   0    0   0

D    0   0    1   0

 

각행과 열은 정점을 의미한다.

한가지 예를 들어보자.

그림 2 중 좌측 그래프 내용을 보자면

1 데이터는 2,3,4 데이터를 향하여(방향이 존재) 간선이 존재한다.
그것을 인접행렬로 표현하자면 아래의 빨간색 글씨와 같다.

 

      A   B   C   D

A    0   1    1   1

B    0   0    1   0

C    0   0    0   0

D    0   0    1   0

 

graph[0][1] = 1

graph[0][2] = 1

graph[0][3] = 1

 

  • 인접 행렬의 필요성
    1. 특정 두 정점이 연결되어 있는지를 확인할때, 직관적으로 알 수 있다.
    2. 가장 빠른 경로를 찾을때 주로 사용한다.



  • 인접 리스트
    각 정점이 어떤 정점과 인접하고 있는지를 리스트로 나타낸 표현방법이다.

 

  • 인접 리스트의 필요성

메모리를 효율적으로 사용하고 싶을 때 인접 리스트를 사용한다.

인접 행렬은 연결 가능한 모든 경우의 수를 저장하기 때문에 상대적으로 메모리를 많이 차지함.


 

그래프 용어

  • 정점 (vertex): 노드(node)라고도 하며 데이터가 저장되는 그래프의 기본 원소입니다.
  • 간선 (edge): 정점 간의 관계를 나타냅니다. (정점을 이어주는 선)
  • 인접 정점 (adjacent vertex): 하나의 정점에서 간선에 의해 직접 연결되어 있는 정점을 뜻합니다.
  • 가중치 그래프 (weighted Graph): 연결의 강도까지 나타내는 그래프로, 쉽게 말해 인접 정점간의 추가적인 정보를 나타낸다. 
    만약 한 도시를 하나의 데이터로 나타내고 여러 도시들을 그래프로 나타냈을때,
    서울이란 데이터와 부산이란 데이터의 사이에 간선이 존재 할 수 있고, 이 사이의 간선은 거리를 나타낼때 각 도시들의 간선에 거리값을 나타내는식의 방식이 가중치 그래프이다.

  • 비가중치 그래프 (unweighted Graph): 연결의 강도가 적혀져 있지 않는 그래프를 뜻함 (일반적인 그래프)
  • 무(방)향 그래프 (undirected graph): 앞서 보았던 내비게이션 예제는 무(방)향 그래프입니다. 서울에서 부산으로 갈 수 있듯, 반대로 부산에서 서울로 가는 것도 가능합니다. 하지만 단방향(directed) 그래프로 구현된다면 서울에서 부산을 갈 수 있지만, 부산에서 서울로 가는 것은 불가능합니다(혹은 그 반대). 만약 두 지점이 일방통행 도로로 이어져 있다면 단방향인 간선으로 표현할 수 있습니다.
  • 진입차수 (in-degree) / 진출차수 (out-degree): 한 정점에 진입(들어오는 간선)하고 진출(나가는 간선)하는 간선이 몇 개인지를 나타냅니다.
  • 인접 (adjacency): 두 정점 간에 간선이 직접 이어져 있다면 이 두 정점은 인접한 정점입니다.
  • 자기 루프 (self loop): 정점에서 진출하는 간선이 곧바로 자기 자신에게 진입하는 경우 자기 루프를 가졌다 라고 표현합니다. 다른 정점을 거치지 않는다는 것이 특징입니다. 자기자신으로만 진입진출하는 데이터(노드 or 정점)
  • 사이클 (cycle): 한 정점에서 출발하여 다시 해당 정점으로 돌아갈 수 있다면 사이클이 있다고 표현합니다. 내비게이션 그래프는 서울 —> 대전 —> 부산 —> 서울 로 이동이 가능하므로, 사이클이 존재하는 그래프입니다.