원티드 프리온보딩 - BE

[자료구조] Graph

고마우미 2023. 9. 13. 14:16

1.그래프 개념

그래프란?

  • 그래프는 객체간의 관계를 Vertext와 Edge로 나타내는 자료구조
  • Grap를 활용해서 표현 할 수 있는 것들
    • 소셜 네트워크
    • 도시-도시 네트워크
    • 인터넷

그래프 용어

  • 인접 (Adjacent)
    • 인접: 두 노드(Vertax) 사이에 간선이 존재 할 경우
  • 부속 (Incidnet)
    • 부속: 두 노드를 연결하는 간선은
  • 차수 (Degree)
    • 차수: 한 노드에 부속된 간선의 개수
    • 무방향 그래프에서, 노드의 차수는 그 노드에 연결된 간선의 개수와 같습니다.
    • 진입차수(In-Degree): 방향 그래프에서 노드로 들어오는 간선의 개수
    • 진출차수(Out-Degree): 방향 그래프에서 노드에서 나가는 간선의 개수
  • 경로 (Path)
    • 정점 A (출발지)에서 정점 B (목적지)로 이어지는 일련의 간선들을 의미
    • 경로 길이 : 경로를 구성하는 간선의 개수
    • 단순 경로 : 동일한 노드를 중복해서 포함하지 않는 경로
    • 사이클 : 그래프 내에서 시작노드와 종료 노드가 동일한 단순경로 의미
  • 루프 (Loop)
    • 루프: 그래프 내의 특정 노드에서 시작해서 동일한 노드로 끝나는 간선 의미, 단일 노드 연결 간선

2.Graph 종류

일반적으로 간선의 특성에 따라서 그래프의 종류가 구분 됩니다.

무방향 그래프& 방향 그래프

  • 무방향 그래프
    • 간선에 방향이 없는 그래프
    • 두노드 A와 B사이ㅔ 간선이 잇다면 A에서 B로의 연결과 B에서 A로의 연결이 가능하다.
  • 방향 그래프
    • 간선에 방향이 있는 그래프
    • 두 노드 A와 B사이에 방향성을 갖는 간선이 있으며, 해당 방향으로만 연결 가능하다.비가중 그래프 & 가중 그래프
  • 비가중 그래프
    • 모든 간선이 동일한 값을 가진 그래프.
  • 가중 그래프
    • 간선이 가중치를 갖는 그래프
    • 이 값은 간선 사이의 '비용','길이','거리'등 다양한것을 나타낼 수 있습니다.
    • 무방향 가중 그래프 = 무방향 + 가중치
    • 방향 가중 그래프 = 방향 그래프 + 가중치비순환 그래프 & 순환 그래프
  • 가중그래프는 노드 사이의 연결 관계에 추가로 비용 혹은 거리등의 추가 속성을 정의 할 수 있어 응용분야가 포괄적인 그래프 모델\

비순환 그래프 & 순환 그래프

  • 비순환 그래프
    • 그래프 내에 어떠한 사이클이 포함 되어있지 않은 그래프
    • 트리는 가장 대표적인 비순환 그래프
    • 의존성 구조, 계층 구조 등에서 비순환 그래프는 자주 사용된다.
  • 순환 그래프
    • 순환 그래프는 그래프 내에 하나 이상의 사이클이 존재
    • 소셜 네트워크 에서 친구 관계를 그래프로 나타낼 때, A와 B가 친구 B와 C가 친구, C와 A가 친구라면 A-B-C-A\

기타 그래프

  • 연결 그래프 : 무방향 그래프에서 임의의 두 노드 사이에 경로가 항상 존재
  • 비 연결 그래프 : 무방향 그래프에서 임의의 두 노드 사이에 경로가 존재 하지 않을 수 있는 그래프
  • 완전 그래프 : 그래프 내의 모든 노드가 1:1 간선으로 연결 된 경우, 즉 연결 가능한 최대 간선 수를 가진 그래프
  • 부분 그래프 : 원래 그래프에서 일부의 노드나 일부의 간선을 제외하면 만든 그래프를 부분 그래프라고한다.
  • 다중 그래프; 두 노드 사이에 여러개의 간선이 있을 수 있는 그래프

3.Graph의 표현

인접 행렬 (Adjacency Matrix)

  • 인접 행렬은 그래프의 정점들 간의 연결 관계를 2차원 배열 (v x v)로 표현하는 방식.
  • 각 행렬의 원소 adjacencyMatrix[i][j]는 정점 i와 정점 j가 연결 되어있으면 1, 그렇지 않으면 0으로 표시합니다.
  • 인접 행렬 표현 방법은 구현하기 쉽고, 두 정점 간의 연결 여부를 직관적으로 확인 할 수 있습니다.
  • 단 정점은 많지만 간선이 적은 희소 그래프의 경우 비 효율적일 수 있습니다.

인접 리스트 (Adjacency List)

  • 인접 리스트는 각 정점이 인접하고 있는 정점을 연결 리스트로 표현하는 방식입니다.
  • 인접 행렬에서는 간선 저장을 통해 그래프를 표현 했다면, 인접 리스트는 각 정점마다 해당 점정과 연결된 정점들의 리스트를 가짐
  • 연결 리스트를 이용하여 인접 노드를 저장하는 방식은 메모리를 절약 할 수 있습니다.
  • 연결이 많아지면 효과과 떨어 질 수 있습니다.

4.Graph 구현하기

추상 데이터 타입

  • 그래프를 사용해서 효율적인 알고리즘을 만들고 사용하기에 필요한 기본 적인 연산
  • 데이터
    • numberOfVertices
    • numberOfEdges
    • LinkedList[] vertices
  • 연산