[자료구조] 그래프(Graph) + 구현하기(Java의 인접행렬과 인접리스트)

2023. 1. 17. 14:28·Algorithm/KBro Study

그래프(Graph)란?

그래프란 요소들이 서로 복잡하게 연결되어 있는 관계를 표현하는 자료구조이다.

그래프는 정점(vertex)과 정점과 정점을 연결하는 간선(edge)들의 집합으로 구성된다.

-> 정점(vertex)는 노드(node)라고도 함

아래는 대표적인 그래프 종류들의 예시이다.

 

그렇다면 이러한 그래프를 구현하는 방법에 대해 알아보자.

 


그래프 구현하기

컴퓨터에서 그래프를 구현하는 방법에는 배열(Array)를 사용하는 방법과 연결리스트(Linked List)를 사용하는 방법이 있다.

 

그래프 구현 - 인접 행렬(Adjacency Materix)

정점 a와 정점 b를 잇는 간선이 있을 경우, 행렬(a,b)에 1을 표기해준다.

만약 가중치가 있는 그래프라면 1 대신 가중치를 넣을 수 있다.

기본적으로 무방향 그래프의 경우는 (a,b) (b,a)에 모두 간선 값을 넣지만, 방향 그래프같은 경우는 위의 표와 같이 방향에 맞는 간선만 표기한다.

 

ex) 정점 1과 3을 잇는 간선이 존재할 때 : graph[1][3] = 1, graph[3][1] = 1

위의 무방향 그래프를 코드로 표현해보자.

public class Main {
 
    public static void print(int[][] graph) {
        for (int i = 1; i < graph.length; i++) {
            for (int j = 1; j < graph.length; j++)
                System.out.print(graph[i][j]+ " ");
            System.out.println();
        }
    }
 
    public static void putEdge(int[][] graph, int x, int y) {
        graph[x][y] = 1;
        graph[y][x] = 1;
    }
 
    public static void main(String[] args) {
        int n = 5; //그래프 정점의 개수
        int[][] graph = new int[n+1][n+1]; //index를 1부터 맞추기 위해 n+1
 
        putEdge(graph, 1, 2);
        putEdge(graph, 1, 3);
        putEdge(graph, 1, 4);
        putEdge(graph, 2, 3);
        putEdge(graph, 2, 5);
        putEdge(graph, 3, 4);
        putEdge(graph, 4, 5);
 
        print(graph);
 
    }
}

결과


그래프 구현 - 인접 리스트(Adjacency List)

해당 노드와 연결되어있는 노드들을 리스트로 쭉 붙이는 방식이다.

ArrayList를 사용하여 코드로 구현해보자.

 

public class Main {
 
    public static void print(ArrayList<ArrayList<Integer>> graph) {
        for (int i = 1; i < graph.size(); i++) {
            ArrayList<Integer> node = graph.get(i);
            System.out.print("node"+"["+i+"] : ");
            for (int j = 0; j < node.size(); j++)
                System.out.print(node.get(j)+ "->");
            System.out.println();
        }
    }
 
    public static void putEdge(ArrayList<ArrayList<Integer>> graph, int x, int y) {
        graph.get(x).add(y);
        graph.get(y).add(x);
    }
 
    public static void main(String[] args) {
        int n = 5; //그래프 정점의 개수
        ArrayList<ArrayList<Integer>> graph = new ArrayList<>();
 
        for (int i = 0; i <= n; i++)
            graph.add(new ArrayList<>()); //각 노드 별 리스트를 만들어준다.
        putEdge(graph, 1, 2);
        putEdge(graph, 1, 3);
        putEdge(graph, 1, 4);
        putEdge(graph, 2, 3);
        putEdge(graph, 2, 5);
        putEdge(graph, 3, 4);
        putEdge(graph, 4, 5);
 
        print(graph);
 
    }
}

결과


인접 행렬과 인접 리스트의 장단점

그렇다면 두 방식의 장단점에 대해 알아보자.

  인접 행렬 인접 리스트
시간 복잡도 O(N^2)     정점 N * N만큼 필요 O(N)      N : 간선의 개수
공간 복잡도 O(V^2)     V개의 노드 표현을 위해 V^2 만큼의 공간이 필요 O(V+E)    V개의 리스트에 간선(E)만    큼 원소가 들어있음
두 정점의 연결 여부 graph[x][y] 의 값으로 한번에 확인 graph<x> 의 원소에서 y가 나올때까지 탐색
인접 노드 파악 여부 N * N만큼 반복문을 돌아 확인한다. 각 리스트에 담겨있는 원소를 확인한다.

 

둘 다 장단점이 있으므로, 아래 상황에 맞게 사용하면 된다. 

  • 인접 행렬 : 그래프에 간선이 많이 존재하는 밀집 그래프에 빠르게 연결 여부 확인
  • 인접 리스트 : 그래프에 간선이 적게 존재하는 희소 그래프의 경우에 인접 노드 빠르게 확인

 

📗참고사이트

[JAVA] 그래프 구현하기 (인접 행렬, 인접 리스트)

[자료구조] 그래프 (Graph) - 인접행렬 vs 인접리스트, DFS, BFS, Connected Component, Spanning Tree

'Algorithm > KBro Study' 카테고리의 다른 글

[알고리즘] 벨만포드 알고리즘 (Bellman-Ford)  (0) 2023.03.02
[알고리즘] 그리디 - 최소 스패닝 트리(Minimum Spanning Tree)  (0) 2023.02.19
[알고리즘] Brute Force(브루트 포스)  (0) 2023.01.08
[자료구조] B-tree, B+tree 이론 정리  (0) 2022.12.28
[자료구조] Java - 해시테이블(HashTable) 이론정리  (0) 2022.12.23
'Algorithm/KBro Study' 카테고리의 다른 글
  • [알고리즘] 벨만포드 알고리즘 (Bellman-Ford)
  • [알고리즘] 그리디 - 최소 스패닝 트리(Minimum Spanning Tree)
  • [알고리즘] Brute Force(브루트 포스)
  • [자료구조] B-tree, B+tree 이론 정리
Ohde
Ohde
블로그 이사했습니다! https://velog.io/@pigonhair/posts
  • Ohde
    Ohde's Blog
    Ohde
  • 전체
    오늘
    어제
    • 전체 (83)
      • Languages | Frameworks (41)
        • Java (10)
        • Spring (23)
        • Docker (8)
      • Git | Github (1)
      • DBMS (4)
        • SQL (4)
      • DevOps | Server (3)
      • OS (6)
        • Linux (6)
      • Algorithm (26)
        • Theory (1)
        • Data Structure (7)
        • BaekJoon (5)
        • Programmers (1)
        • KBro Study (12)
  • 블로그 메뉴

    • Github
    • BaekJoon
    • solved class
    • 방명록
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Ohde
[자료구조] 그래프(Graph) + 구현하기(Java의 인접행렬과 인접리스트)
상단으로

티스토리툴바