[자료구조] 그래프(Graph)란?

2024. 7. 3. 00:25·Computer Science/자료구조

그래프(Graph)란?

그래프는 여러 개의 노드(node)(정점(vertex))와 이를 연결하는 간선(Edge)로 이루어진 비선형 자료구조이다.

비선형 구조: 데이터를 일렬으로 구성하지 않고, 자료 순서나 관계가 복잡한 자료구조

그래프 용어

용어

  • 정점(Vertice)
    • 노드(node)라고도 하는 데이터가 저장되는 그래프의 기본 원소
  • 간선(Edge)
    • 정점을 연결하는 선
  • 인접 정점(Adjacent Vertex)
    • 특정 정점에 간선으로 직접 연결되어 있는 정점
  • 단순 경로(Simple-path)
    • 시작 정점에서 끝 정점까지 가는 경로 중 어떤 정점도 두 번 이상 방문하지 않는 경로
  • 차수(Degree)
      - 무방향 그래프에서 하나의 정점에 인접한 정점의 수(위 사진에서 3의 정점은 3(1, 4, 5와 연결됨))
  • 진출 차수(Out-degree)
    • 한 정점에서 진출(나가는 간선)하는 간선의 수
  • 진입 차수(In-degree)
    • 한 정점에 진입하는 간선의 수
  • 사이클(Cycle)
    • 한 정점에서 출발해 다시 해당 정점으로 돌아갈 수 있다면 사이클이 있다고 함
  • 자기 루프(Self Loop)

  • 정점에서 진출하는 간선이 바로 자기 자신에게 진입하는 경우 자기 루프를 가졌다고 표현한다.
  • 위 사진에서 B가 자기 루프이다.

그래프 종류

그래프 구현

그래프는 인접 행렬을 이용하여 구현하는 방식과 인접 리스트를 이용하여 구현하는 방식이 존재한다.

인접 행렬

2차원 배열을 이용하여 그래프를 구현하는 방식이다. 두 정점이 이어져 있다면 1, 이어져 있지 않다면 0으로 표현한다. 인접 행렬을 이용한 방식은 정점 간 관계 유무를 판단하고 가장 빠른 경로를 찾고자 할 때 주로 사용하여 O(1)의 시간 복잡도를 갖고 있다. 하지만 데이터가 커질 수록 2차원 배열도 커지기 때문에 많은 공간(메모리)를 차지하고 모든 정점 간의 간선 유무를 저장해야 하기 때문에 O(n^2)의 시간 복잡도를 갖는다.

인접 리스트

정점과 정점의 연결을 리스트 형태로 표현하는 방식이다. 특정 정점을 Key로 두고 해당 정점과 간선으로 연결된 정점을 Value로 두어 표시한다. 위 사진에서 정점 1은 2, 3, 4 정점과 연결되어 있고 정점 2는 1, 3 정점과 연결되어 있다.
인접 리스트를 이용한 방식은 인접 행렬을 이용한 방식보다 공간(메모리)를 적게 사용하고 연결 정보를 탐색할 때 O(n)의 시간 복잡도를 갖는 장점이 있다. 하지만 특정 점들이 연결되어 있는지 확인하려면 시간이 오래 걸리고 구현이 어렵다는 단점이 있다.

그래프 탐색 알고리즘

그래프를 이용한 탐색 알고리즘은 DFS와 BFS가 존재한다. 두 알고리즘은 추후 자세하게 공부할 것이므로 간단하게만 설명하겠다.

DFS(Depth-First Search) - 깊이 우선 탐색

시작 정점에서 출발하여 더 이상 연결된 노드가 존재하지 않을 때까지 자식 노드를 탐색한다. 계속 탐색하다 더 이상 노드가 존재하지 않는다면 한 단계 이전으로 돌아가서 다른 방향으로 다시 탐색을 실행하는 방식이다.

BFS(Breadth-First Search) - 너비 우선 탐색

시작 정점에 인접하는 자식 노드들은 모두 탐색한다. 연결된 자식 노드를 모두 탐색했다면 자식 노드 깊이로 내려가서 다시 인접하는 자식 노드들을 모두 탐색하는 방식이다.

출처

https://medium.com/depayse/kotlin-data-structure-graph-135edd3646ae
https://velog.io/@kwontae1313/%ED%8A%B8%EB%A6%AC%EC%99%80-%EA%B7%B8%EB%9E%98%ED%94%84%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90
https://velog.io/@vagabondms/DFS-vs-BFS

'Computer Science > 자료구조' 카테고리의 다른 글

서로소 집합(Disjoint Set)과 Union Find  (0) 2025.03.19
[자료구조] 우선순위 큐(Priority Queue), 힙(Heap)이란?  (0) 2024.06.25
[자료구조] Hash란? - (HashTable / HashMap in JAVA)  (0) 2024.06.22
'Computer Science/자료구조' 카테고리의 다른 글
  • 서로소 집합(Disjoint Set)과 Union Find
  • [자료구조] 우선순위 큐(Priority Queue), 힙(Heap)이란?
  • [자료구조] Hash란? - (HashTable / HashMap in JAVA)
토자맨
토자맨
  • 토자맨
    개발하는 토자맨
    토자맨
  • 전체
    오늘
    어제
    • 개발 공부
      • 코딩 테스트
        • 코드업 기초 100제
        • 백준
        • 99클럽
        • 자료구조
        • 알고리즘
      • Programming Language
        • 자바(JAVA)
      • Back-end
        • Spring
      • Front-end
        • html
        • css
      • DevOps
        • AWS
        • CI CD
        • Docker
        • 홈서버
        • Git
      • Computer Science
        • 자료구조
        • 알고리즘
        • 운영체제
        • OS,Network,DB,DesignPattern
      • 프로젝트
        • 웨이트 쇼핑몰
      • 공부 로드맵
        • 2학년 겨울방학
        • 3학년 2학기
        • 3학년 겨울방학
      • 일상
        • 기타 정보
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    99클럽 #코딩테스트 준비 #개발자 취업 #항해99 #til
    피보나치 수 #백준 #dp
    git filter-repo
    bfs #백준
    오블완
    이진탐색 #이분탐색 #알고리즘
    백준 #dfs #11725번
    git filter-branch #commit 수정 #commit
    ec2 멈춤 #ec2 터짐 #ec2 ssh 연결 끊김 #ec2 끊김
    dfs #백준
    이진탐색 #이분탐색 #백준
    백준 #dfs #알고리즘
    백준 #dfs
    dp #백준 #동적계획법
    프로그래머스 #dp
    프로그래머스 #dfs
    dfs #알고리즘
    백준 #bfs
    solid #객체지향설계원칙
    백준 #dp #동적계획법
    백준 #이진탐색 #이분탐색
    백준 #아기상어2 #bfs
    스프링 #spring #스프링 컨테이너 #스프링 컨텍스트
    티스토리챌린지
    스프링핵심원리 #김영한 #의존관계자동주입 #의존관계 자동 주입
    nvidia-docker #docker cuda #docker gpu #엔비디아 도커
    nvidia container toolkit #
    싱글톤 패턴 #싱글톤 컨테이너 #싱글톤 레지스트리 #싱글톤 객체 상태 #무상태 #stateless #유지상태 #staleful
    bfs #최단거리탐색 #프로그래머스
    bfs #프로그래머스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
토자맨
[자료구조] 그래프(Graph)란?
상단으로

티스토리툴바