[자료구조] Graph

 

그래프(Graph)에 대하여

지난 포스팅까지 다양한 트리 구조에 대해 알아보았다면, 이번에는 또 다른 자료 구조인 그래프(Graph)에 대해 자세히 알아보겠다. 그래프는 객체 간의 관계를 표현하는 도구이며, 소셜 네트워크, 교통망, 인터넷 구조 등 다양한 시나리오를 모델링하는 데 사용될 수 있다.

그래프란?

본질적으로 그래프는 객체들의 집합과 그들 사이의 연결 관계를 나타낸다. 객체는 vertex 또는 node라고 불리며, 연결 관계는 edge로 나타낸다. vertex를 도시, edge는 이 도시를 잇는 도로라고 생각할 수 있다.

그래프의 핵심 개념

그래프를 다룰 때 마주칠 몇 가지 필수 용어를 살펴보겠다.

  • Vertex: 그래프의 기본 단위 또는 객체
  • Edge: 두 정점 사이의 연결 또는 링크
  • Directed Edge: 특정 방향을 가진 edge로, vertex 간의 일방적인 관계를 나타냄(예: 일방 통행 도로)
    * 특정 vertex 기준 들어오면 incoming edge, 나가면 outgoing edge
  • Undirected Edge: 방향이 없는 edge으로, vertex 간의 양방향 관계를 나타냄 (예: 일반 도로)
  • Adjacent Vertices: edge로 연결된 두 vertices (예: 도로로 연결된 두 도시)
  • Parallel Edges: 동일한 두 vertex를 연결하는 여러 개의 edges (예: 두 도시를 연결하는 여러 개의 도로)
  • Incident: 특정 vertex의 edges (예: 도시로 가는 여러 개의 도로)
  • Path: edge로 연결된 vertex의 순서 (예: 여러 도시를 거치는 경로)
    * vertex 중복이 없다면 simple path라 한다.
  • Cycle: 시작 vertex와 끝 vertex가 동일한 경로 (예: 출발 도시로 다시 돌아오는 경로)
    * vertex 중복이 없다면 simple cycle이라 한다.

그래프 구현 방법

컴퓨터 프로그램에서 그래프를 표현하는 방법은 여러 가지가 있다. 몇 가지 일반적인 방법을 살펴보자.

  1. Edge List : edge 쌍의 단순한 리스트다. 이 표현 방식은 간단하지만, 대규모 그래프에는 비효율적일 수 있다.

    edge list

  2. Adjacency List : 각 vertex은 incident edge들의 리스트를 갖는다. 이는 비교적 적은 edge를 가진 sparse graph에 많이 사용된다.

    adjacency list

  3. Adjacency Matrix : 2차원 행렬로, 행과 열은 vertex를 나타내고, 각 항목은 두 vertex 사이에 edge의 존재 여부를 나타낸다. 이는 많은 edge을 가진 dense graph)에 자주 사용된다.

    adjacency matrix

  4. Adjacency Map : key가 vertex이고 value를 edge로 하는 맵(또는 딕셔너리)다. 이는 유연성을 제공하며 다양한 그래프 연산에 효율적일 수 있다.

    adjacency map

참고) sparse와 dense
|E| : edge 수, |V| : vertex 수
|V| = n이라 할 때 vertex 하나 당 edge를 최대 n-1개 까지 연결할 수 있으므로
|E| <= n(n-1)라는 부등식을 만족한다.(undirected edge라면 중복 제외 *1/2)

마무리하며

이번 포스팅에서는 그래프의 기본 개념, 용어, 그리고 다양한 표현 방법에 대해 알아보았다. 그래프의 시작에 불과하다. 다음 포스팅에서는 그래프 탐색 알고리즘인 깊이 우선 탐색(Depth-First Search, DFS)과 너비 우선 탐색(Breadth-First Search, BFS)에 대해 자세히 알아보겠다.

추천글:

[자료구조] 왜 자료구조를 배우는가?
(https://hyeonb.blogspot.com/2024/03/blog-post.html)
hyeon_B

안녕하세요! AI 기술을 이용해 더 나은 세상을 만들어 나가고 싶은 과기원생 Hyeon이라고 합니다. 저는 앞으로 인공지능 시대에는 지식을 '활용'하는 능력이 중요해질 것이라고 생각합니다. 대부분의 일들은 인공지능이 뛰어난 모습을 보이지만, 인공지능은 데이터로 부터 연관관계를 학습하기 때문에 지식들을 새로 통합해서 활용하는 능력이 부족합니다. 인공지능이 뉴턴 전에 만들어졌다면 사과가 떨어지는 이유에 대답하지 못했을 것이고, 아인슈타인 전에 만들어졌다면 중력이 어떻게 생기는지 설명하지 못했을 것입니다. 따라서 앞으로 우리는 '본질'을 탐구하고 그 본질로부터 다른 곳에 적용하며 인공지능을 현명하게 활용해야 할 것입니다. 함께 인공지능 시대를 준비합시다!

댓글 쓰기

다음 이전

POST ADS1

POST ADS 2