인접 행렬 & 인접 리스트 (Adjacency Matrix & Adjacency List)

2023. 8. 11. 23:24·알고리즘/알고리즘 정리
728x90

인접 행렬 (Adjacency Matrix)

두 정점 간의 연결 관계를 N x N 크기의 행렬(2차원 배열)로 나타냄.

 

방향 그래프의 경우
무방향 그래프의 경우

  • 특정 노드와 연결되어 있는 모든 노드 확인: O(N)
  • 두 정점 간의 연결 관계 확인: O(1)
  • 공간 복잡도: O(N^2)
  • 정점이 많아지면 메모리 초과로 인해 사용 불가
  • 무방향 그래프의 경우, 주대각선을 기준으로 대칭인 성질을 지닌다.

인접 행렬의 장점 & 단점

[ 장점 ]

  • 구현이 쉬움.
  • 두 정점간의 연결 관계 확인해야 하는 경우, 확인이 쉽다. 

[ 단점 ]

  • 특정 노드와 연결된 모든 노드를 검색해야 할 경우, 노드 개수 O(N) 만큼의 시간복잡도를 지님.
  • 전체 노드 탐색 시 시간복잡도: O(N^2)

인접 행렬 구현

//해당 인접 행렬은 무방향 그래프의 경우이다.

#include <iostream>

using namespace std;

int main() {
    int n, m;
    int adj[10][10];
    
    cin >> n >> m;
    
    for (int i=0; i<m; i++) {
      int a, b;
      cin >> a >> b;
      adj[a][b] = 1;
      adj[b][a] = 1;
    }
}

인접 리스트 (Adjacency List)

각 정점에 연결된 정점들을 리스트(1차원 배열)에 담아 보관함.

 

방향 그래프의 경우
무방향 그래프의 경우

  • 두 정점간의 연결 관계 확인: O(min(degree(i), degree(j)))
  • 특정 노드와 연결되어 있는 모든 노드 확인: O(degree(i))
  • 공간 복잡도: O(N+Edge)

인접 리스트의 장점 & 단점

[ 장점 ]

  • 실제로 연결된 노드만 저장.
  • 모든 vector의 원소의 개수 합 = 간선의 개수
  • 정점 사이의 간선이 적은 경우 좋음.
  • 연결된 정점들을 탐색해야 하는 경우 사용.

[ 단점 ]

  • 단지 노드가 서로 연결되어 있는지 확인하는데 오래걸림.
    • 인접 행렬은 adj[i][j] = 1인지 확인만 하면 되지만, 인접리스트의 경우 adj[i]가 j를 원소로 가지는 지 확인해봐야 하기 때문.

인접 리스트 구현

// 해당 인접 리스트는 무방향 그래프의 경우이다.

#include <iostream>

using namespace std;

int main() {
    int n, m;
    vector<int> adj[10];
    
    cin >> n >> m;
    
    for (int i=0; i<n; i++) {
      int a, b;
      cin >> a >> b;
      adj[a].push_back(b);
      adj[b].push_back(a);
    }
}

요약

[ 인접 행렬 ]

  • 정점 사이의 연결 관계(간선)가 많을 경우.
  • 특정 정점과 정점의 연결 관계를 많이 확인해야 하는 경우. (adj[i][j] = 1 체크)

[ 인접 리스트 ]

  • 정점 사이의 연결관계(간선)가 적은 경우.
  • 연결된 정점들을 탐색해야 하는 경우. (현재 노드의 인접 리스트에 접근하여, 다음 노드를 탐색)
저작자표시 (새창열림)

'알고리즘 > 알고리즘 정리' 카테고리의 다른 글

분할 정복 (Devide & Conquer)  (0) 2023.07.22
그리디 알고리즘 (Greedy Algorithm)  (0) 2023.07.20
다이나믹 프로그래밍(Dynamic Programming)  (26) 2023.07.19
백트래킹(Back Tracking)  (0) 2023.07.17
'알고리즘/알고리즘 정리' 카테고리의 다른 글
  • 분할 정복 (Devide & Conquer)
  • 그리디 알고리즘 (Greedy Algorithm)
  • 다이나믹 프로그래밍(Dynamic Programming)
  • 백트래킹(Back Tracking)
기짜낭
기짜낭
생각이 많지만, 지금 내가 해야할 것을 하자.
  • 기짜낭
    So tired
    기짜낭
    • 분류 전체보기 (199)
      • 개발 (11)
        • Javascript (19)
        • Typescript (5)
        • Canvas (8)
        • React (13)
        • C (3)
      • 활동 (63)
        • 개인 프로젝트 (33)
        • 나눔 서포터즈 3기 (9)
        • 멋쟁이 사자처럼 (7)
        • 0&1 C++ 자료구조 스터디 (0)
        • 제 9회 창업 아이디어톤 (3)
        • Poom (ZeroWasteShop) (3)
        • 해커톤 (2)
        • 우테코 프리코스 7기 (6)
      • 알고리즘 (27)
        • 알고리즘 정리 (5)
        • 백준 (18)
        • 프로그래머스 (4)
      • 강연 (7)
      • 독서 (18)
      • 회고 & 생각 (16)
        • 연간회고 (4)
      • 기타 (5)
  • 블로그 메뉴

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

  • 공지사항

    • ※ 예전 블로그
  • 인기 글

  • 태그

    대학
    디자인
    프로젝트
    HTML
    타입스크립트
    1주 1권
    HTML5
    CSS
    ES6
    프론트엔드
    Erica
    개발
    백준
    한양대학교
    1주에 1권씩
    우테코
    개발자
    TypeScript
    3기
    canvas
    알고리즘
    군대
    프로그래밍
    tutorial
    독후감
    개념
    react
    에리카
    Javascript
    독서
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
기짜낭
인접 행렬 & 인접 리스트 (Adjacency Matrix & Adjacency List)
상단으로

티스토리툴바