노트

그래프

Graph

CS#algorithm · 연결된 개념 7개

쉽게 말하면

그래프는 지하철 노선도처럼 역과 역을 잇는 선으로 '무엇과 무엇이 연결돼 있는지'를 나타내는 자료구조예요. 친구 관계, 웹 링크, 패키지 의존성도 다 이 모양이에요.

비유가 깨지는 곳 노선도는 그림이지만 코드에서는 정점마다 이웃 목록을 두는 인접 리스트나 정점×정점 표인 인접 행렬로 담아요. 실제 그래프는 대개 간선이 드물어서 인접 리스트를 주로 써요.

정점(vertex, 노드)과 정점들을 잇는 간선(edge)으로 이루어진 자료구조. 트리도 그래프의 한 종류다. SNS 친구 관계, 지도와 경로, 웹 페이지 링크, 추천 시스템, 패키지 의존성처럼 "무엇과 무엇이 연결돼 있다"는 모든 것을 표현한다. 이 지식 맵도 노트를 정점, 링크를 간선으로 한 그래프다.

종류

  • 무방향 / 방향(Undirected / Directed): 친구 관계(양쪽) / 팔로우(한쪽)
  • 가중치 없음 / 가중치 있음(Unweighted / Weighted): 간선에 거리·비용이 붙으면 가중 그래프다(다익스트라 알고리즘)
  • 두 정점이 간선으로 이어지면 "인접하다(Adjacent)"고 한다

표현 방법

인접 리스트(Adjacency List)인접 행렬(Adjacency Matrix)
모양정점마다 이웃 목록정점 수 × 정점 수 표
공간O(V + E)O(V²)
두 정점이 이웃인가이웃 목록을 훑는다O(1)
이웃 전체 순회빠르다한 행 전체를 본다
const graph: Record<string, string[]> = {
  A: ['B', 'C'],
  B: ['A', 'D'],
  C: ['A', 'D'],
  D: ['B', 'C'],
}

실제 그래프는 대부분 간선이 드문(희소한, Sparse) 거대한 그래프라서 인접 리스트를 주로 쓴다.

순회

모든 정점을 방문하는 방법은 깊게 먼저 가는 깊이 우선 탐색 (DFS)와 가까운 곳부터 넓게 가는 너비 우선 탐색 (BFS)가 있다. 방문한 정점을 기록해 순환에 빠지지 않게 하는 것이 트리 순회(트리 순회)와 다른 점이다. 의존 관계 그래프에서 순환을 찾고 순서를 정하는 일은 번들러와 모노레포 빌드 도구의 핵심 작업이다.

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 연결 리스트

    각 노드가 값과 다음 노드를 가리키는 포인터를 가지고 사슬처럼 이어진 자료구조. 리스트는 맨 앞(Head)과 맨 뒤(Tail), 길이 정도만 기억한다. 배열과 달리 인덱스가 없다.

  • DB 인덱스와 트레이드오프

    DB 인덱스는 특정 컬럼 값으로 행을 빨리 찾도록 테이블 옆에 따로 유지하는 보조 자료구조(auxiliary data structure)다. 관계형 DB의 기본 인덱스는 정렬된 균형 트리(B-tree 계열)라서, 전체를 훑지 않고 트리를 따라 내려가 원하는 행에 닿는다.

  • B-tree와 B+tree

    한 노드가 자식을 수백 개 가지는 균형 다진 트리. 높이가 낮아 디스크 페이지를 몇 번만 읽고 값을 찾으며, 잎이 정렬된 채 이어져 있어 범위 검색에 강하다.

  • GraphQL

    GraphQL은 클라이언트가 필요한 데이터의 모양을 쿼리로 적어 보내면 서버가 정확히 그 모양으로 응답하는 API 쿼리 언어(query language)다. Facebook이 2012년 내부에서 만들어 2015년 공개했고, 지금은 GraphQL Foundation이 관리한다.

  • 이진 힙

    부모가 항상 자식보다 크거나(최대 힙, Max Heap) 작은(최소 힙, Min Heap) 완전 이진 트리(Complete Binary Tree). 형제끼리의 순서는 정하지 않는다. 가장 크거나 작은 값이 항상 루트에 있어 꺼내기 쉽다.

보기 옵션