인접 행렬
1. 개요
1. 개요
인접 행렬은 그래프 이론에서 그래프의 정점들 간의 연결 관계를 행렬 형태로 표현한 자료구조이다. 주로 그래프 표현이나 그래프 알고리즘 구현, 네트워크 분석 등에 활용된다.
이 표현 방식은 2차원 배열을 사용하며, 정점 i에서 정점 j로의 간선 존재 여부를 행렬의 (i, j) 원소 값으로 표시한다. 이를 통해 방향 그래프와 무방향 그래프를 모두 표현할 수 있으며, 가중치 그래프의 경우 간선의 가중치를 행렬 값에 직접 저장할 수 있다.
인접 행렬의 주요 특징 중 하나는 두 정점 사이에 특정 간선이 존재하는지 여부를 상수 시간(O(1))에 확인할 수 있다는 점이다. 이는 행렬의 해당 위치를 직접 참조하기만 하면 되기 때문이다.
2. 정의
2. 정의
인접 행렬은 그래프 이론에서 그래프의 정점들 간의 연결 관계를 행렬 형태로 표현한 자료구조이다. 이 표현 방식은 주로 그래프 알고리즘을 구현하거나 네트워크 분석을 수행할 때 활용된다.
구체적으로, 정점의 개수가 n개인 그래프를 표현하기 위해 n x n 크기의 2차원 배열을 사용한다. 이 행렬에서 i번째 행과 j번째 열에 위치한 원소의 값은 정점 i에서 정점 j로 향하는 간선의 존재 여부 또는 그 정보를 나타낸다. 가장 기본적인 형태에서는 간선이 존재하면 1, 존재하지 않으면 0과 같은 값을 저장하여 연결 상태를 표시한다.
이 방식은 방향 그래프와 무방향 그래프를 모두 표현할 수 있다. 무방향 그래프의 경우, 간선이 대칭적이므로 인접 행렬도 대칭 행렬이 된다. 또한 가중치 그래프를 표현할 때는 행렬의 각 원소에 간선의 가중치 값을 직접 저장할 수 있으며, 간선이 없는 경우에는 0이나 무한대(∞)와 같은 특별한 값으로 표시한다.
인접 행렬의 가장 큰 장점 중 하나는 두 정점 사이에 특정 간선이 존재하는지 여부를 상수 시간(O(1))에 확인할 수 있다는 점이다. 행렬의 (i, j) 위치에 접근하는 것만으로 즉시 연결 정보를 얻을 수 있어, 간선의 존재를 빈번히 확인해야 하는 알고리즘에 유리하다.
3. 표현 방법
3. 표현 방법
3.1. 무방향 그래프
3.1. 무방향 그래프
무방향 그래프에서 인접 행렬은 대칭 행렬의 형태를 가진다. 정점 i와 정점 j 사이에 간선이 존재하면, 행렬의 (i, j) 원소와 (j, i) 원소 모두 1(또는 가중치)의 값을 가지게 된다. 이는 연결 관계가 양방향으로 동일하기 때문이다.
따라서 무방향 그래프의 인접 행렬을 저장할 때는 주대각선을 기준으로 한 삼각 행렬만을 저장하여 공간 효율성을 높일 수도 있다. 그러나 일반적인 구현에서는 개념의 명료성과 간선 확인의 편의를 위해 전체 2차원 배열을 사용하는 경우가 많다.
3.2. 방향 그래프
3.2. 방향 그래프
방향 그래프에서 인접 행렬은 정점 간의 연결 방향을 명확히 표현한다. 정점 i에서 정점 j로 향하는 간선이 존재할 경우, 행렬의 (i, j) 위치 값을 1로 설정한다. 반대로, 정점 j에서 정점 i로의 간선이 없으면 (j, i) 위치는 0으로 남는다. 이는 행렬이 비대칭적일 수 있음을 의미하며, 방향 그래프의 비대칭적 연결 관계를 그대로 반영한다.
예를 들어, 정점 A에서 B로 가는 단방향 간선이 있다면, 행렬에서 A행 B열은 1이 되지만, B행 A열은 0이 된다. 이러한 표현 방식은 유향 그래프의 특성인 진출차수와 진입차수를 쉽게 계산할 수 있게 한다. 한 정점의 진출차수는 해당 행의 모든 값의 합으로, 진입차수는 해당 열의 모든 값의 합으로 구할 수 있다.
인접 행렬은 그래프 알고리즘 중에서도 모든 정점 쌍 간의 최단 경로를 찾는 플로이드-워셜 알고리즘 구현에 자주 사용된다. 이 알고리즘은 행렬을 직접 갱신해 나가는 방식으로 동작하기 때문이다. 또한, 위상 정렬이나 강연결요소 탐색과 같은 방향 그래프 분석에도 활용될 수 있다.
3.3. 가중치 그래프
3.3. 가중치 그래프
가중치 그래프의 인접 행렬 표현에서는 각 행렬 원소가 단순한 연결 여부(0 또는 1) 대신 해당 간선의 가중치 값을 저장한다. 정점 i에서 정점 j로 향하는 간선이 존재하고 그 가중치가 w일 경우, 행렬의 (i, j) 위치에 w를 기록한다. 간선이 존재하지 않는 경우, 즉 두 정점 사이에 연결이 없을 때는 어떤 값으로 표시할지가 중요한데, 일반적으로는 해당 그래프에서 가능한 가중치 범위를 벗어나는 특별한 값을 사용한다. 대표적으로 무한대(∞)나 0, 또는 -1과 같은 값을 사용하며, 이는 구현 시 알고리즘의 편의성에 따라 결정된다.
가중치 그래프의 인접 행렬은 방향 그래프와 무방향 그래프 모두에 적용될 수 있다. 무방향 그래프의 경우, 행렬이 대칭 구조를 이루게 되어 (i, j) 원소와 (j, i) 원소의 값이 동일한 가중치 w로 채워진다. 이는 무방향 간선이 양방향으로 동일한 연결 강도 또는 비용을 가짐을 의미한다. 반면 방향 그래프에서는 행렬이 비대칭일 수 있으며, 정점 A에서 B로의 간선 가중치와 B에서 A로의 간선 가중치가 서로 다를 수 있다.
이 표현 방식의 주요 장점은 두 정점 사이의 연결 여부와 그 가중치를 상수 시간(O(1))에 확인할 수 있다는 점이다. 또한 행렬 구조 덕분에 특정 그래프 알고리즘, 특히 모든 정점 쌍의 최단 경로를 구하는 플로이드-워셜 알고리즘과 같이 전체 간선 정보에 대한 반복적 접근이 필요한 알고리즘 구현에 직관적이고 효율적이다. 그러나 희소 그래프의 경우, 실제 존재하는 간선 수에 비해 많은 메모리 공간을 낭비한다는 단점은 가중치가 없는 경우와 동일하게 유지된다.
그래프 유형 | 행렬 (i, j) 원소 값 | 행렬 (j, i) 원소 값 | 비고 |
|---|---|---|---|
무방향 가중치 그래프 | 가중치 w | 가중치 w | 대칭 행렬 |
방향 가중치 그래프 | 가중치 w (i→j 방향) | 가중치 v (j→i 방향) 또는 '무연결' 값 | 비대칭 가능 |
간선 없음 | '무연결' 표시값 (예: 0, ∞, -1) | '무연결' 표시값 |
4. 특징
4. 특징
4.1. 장점
4.1. 장점
인접 행렬의 가장 큰 장점은 두 정점 사이에 간선이 존재하는지 여부를 상수 시간, 즉 O(1)에 확인할 수 있다는 점이다. 행렬의 특정 행과 열 인덱스에 직접 접근하여 연결 상태를 확인하면 되므로, 특정 연결 관계를 빠르게 조회해야 하는 알고리즘에 유리하다.
또한 구현이 직관적이고 단순하다는 장점이 있다. 2차원 배열을 사용하기 때문에 코드로 표현하기 쉽고, 그래프 이론의 기본 개념을 이해하는 데 도움이 된다. 특히 방향 그래프와 무방향 그래프, 그리고 가중치 그래프를 모두 동일한 행렬 구조로 표현할 수 있어 범용성이 높다.
4.2. 단점
4.2. 단점
인접 행렬의 가장 큰 단점은 희소 그래프를 표현할 때 발생하는 공간 낭비이다. 정점의 개수가 V개일 때, 인접 행렬은 V^2 크기의 2차원 배열을 필요로 한다. 간선의 개수 E가 V^2에 비해 현저히 적은 희소 그래프의 경우, 행렬의 대부분의 원소가 0(또는 무한대)으로 채워지게 되어 메모리 사용 효율이 매우 떨어진다. 이는 그래프의 규모가 커질수록 더 심각한 문제가 된다.
또 다른 단점은 특정 정점에 연결된 모든 이웃 정점(인접 정점)을 찾는 연산의 비효율성이다. 정점 하나의 차수를 알아내거나 모든 인접 정점을 순회하려면, 해당 정점에 해당하는 행 또는 열의 모든 V개의 원소를 확인해야 한다. 이 연산의 시간 복잡도는 O(V)로, 인접 리스트 자료구조를 사용할 때의 O(차수)에 비해 일반적으로 느리다.
마지막으로, 그래프에 정점을 추가하거나 삭제하는 작업이 상대적으로 불편하다는 점도 단점으로 꼽힌다. 정점을 추가하려면 행렬의 크기를 늘려 재할당해야 하며, 정점을 삭제할 경우 행과 열을 제거하거나 표시하는 추가 로직이 필요하다. 이는 동적 배열을 사용하지 않는 한 유연성이 부족한 구조이다.
5. 시간 복잡도
5. 시간 복잡도
인접 행렬을 사용할 때의 시간 복잡도는 수행하는 연산에 따라 다르다. 가장 큰 장점은 두 정점 사이에 간선이 존재하는지 확인하는 연산의 시간 복잡도가 O(1)이라는 점이다. 이는 행렬의 특정 인덱스에 직접 접근하여 값을 확인하면 되기 때문이다.
그러나 특정 정점에 연결된 모든 이웃 정점을 찾는 연산은 O(V)의 시간이 소요된다. V는 정점의 개수로, 행렬에서 해당 정점의 행이나 열 전체를 순회해야 하기 때문이다. 마찬가지로 그래프에 존재하는 모든 간선을 나열하는 작업도 O(V^2)의 시간이 걸린다. 이는 2차원 배열의 모든 원소를 확인해야 하기 때문이다.
그래프 순회 알고리즘인 깊이 우선 탐색이나 너비 우선 탐색을 인접 행렬로 구현할 경우, 각 정점의 이웃을 찾는 데 O(V) 시간이 걸리므로 전체 시간 복잡도는 O(V^2)이 된다. 이는 인접 리스트 표현을 사용했을 때의 O(V+E) 복잡도보다 일반적으로 비효율적이다. 여기서 E는 간선의 개수를 의미한다.
6. 공간 복잡도
6. 공간 복잡도
인접 행렬의 공간 복잡도는 그래프의 정점 수에 따라 결정된다. 정점이 V개인 그래프의 인접 행렬은 V x V 크기의 2차원 배열로 표현되므로, 필요한 총 공간은 V의 제곱에 비례한다. 이는 정점 간의 실제 간선 수와 무관하게 항상 V^2개의 원소를 저장해야 함을 의미한다.
따라서 인접 행렬의 공간 복잡도는 O(V^2)이다. 이는 밀집 그래프처럼 간선이 많은 경우에는 효율적일 수 있지만, 희소 그래프처럼 실제 간선 수가 적은 경우에는 메모리 낭비가 발생할 수 있는 구조적 특징이다. 이러한 공간 사용 특성은 인접 리스트와 비교되는 주요 차이점 중 하나이다.
7. 응용 분야
7. 응용 분야
인접 행렬은 그래프 이론과 알고리즘 구현에서 널리 사용되는 기본적인 자료구조이다. 그 직관적인 구조 덕분에 다양한 컴퓨터 과학 및 응용 분야에서 그래프를 표현하고 분석하는 핵심 도구로 활용된다.
주요 응용 분야로는 그래프 알고리즘의 구현이 있다. 플로이드-워셜 알고리즘은 모든 정점 쌍 간의 최단 경로를 찾는 대표적인 알고리즘으로, 중간 정점을 거치는 모든 가능성을 체계적으로 검토하기 위해 인접 행렬을 직접적으로 사용하며 갱신한다. 또한 너비 우선 탐색이나 깊이 우선 탐색과 같은 기본적인 그래프 순회 알고리즘에서도 정점 간 연결 상태를 빠르게 확인하는 데 유용하게 쓰인다.
네트워크 분석 분야에서도 인접 행렬은 중요한 역할을 한다. 소셜 네트워크에서 사용자 간의 친구 관계, 통신 네트워크에서 장치 간의 연결 상태, 혹은 교통 네트워크에서 도시 간의 도로 연결을 행렬로 표현하면 네트워크의 구조적 특성을 수학적으로 분석하기 용이하다. 이를 통해 연결 중심성이나 군집 계수 같은 네트워크 지표를 계산할 수 있다.
이외에도 게임 이론에서 플레이어 간의 상호작용 모델링, 컴파일러 설계에서 제어 흐름 그래프 표현, 로보틱스에서 환경 지도 생성 및 경로 계획 등 다양한 분야에서 그래프를 표현하는 표준적인 방법으로 인접 행렬이 채택되고 있다.
8. 구현 예시 (의사 코드)
8. 구현 예시 (의사 코드)
인접 행렬은 2차원 배열을 사용하여 구현한다. 정점의 개수를 n이라고 할 때, n x n 크기의 행렬을 생성하고, 각 행과 열은 정점에 대응된다. 행렬의 원소는 일반적으로 정수형 변수로 선언하며, 간선이 존재하지 않음을 나타내는 특정 값(예: 0 또는 무한대)으로 초기화한다.
다음은 인접 행렬을 사용한 기본적인 그래프 연산의 의사 코드 예시이다. 여기서는 정점 번호가 0부터 n-1까지라고 가정한다.
연산 | 의사 코드 |
|---|---|
행렬 초기화 |
|
간선 추가 (무방향) |
|
간선 추가 (방향) |
|
간선 추가 (가중치) |
|
간선 존재 여부 확인 |
|
정점 v의 이웃 탐색 |
|
구체적인 프로그래밍 언어에 따른 구현은 다를 수 있으나, 핵심은 모든 정점 쌍에 대한 연결 정보를 상수 시간에 접근할 수 있는 자료 구조를 구성하는 것이다. 이 구조는 플로이드-워셜 알고리즘과 같이 모든 정점 쌍의 관계를 계산해야 하는 알고리즘에 적합하다.
9. 인접 리스트와의 비교
9. 인접 리스트와의 비교
인접 행렬과 인접 리스트는 그래프를 표현하는 대표적인 두 가지 자료구조이다. 각 방식은 장단점이 명확히 구분되어 주어진 문제의 특성에 따라 선택해야 한다.
비교 항목 | 인접 행렬 | 인접 리스트 |
|---|---|---|
공간 복잡도 | O(V²) | O(V + E) |
간선 존재 확인 | O(1) | O(degree(V)) |
정점의 모든 이웃 탐색 | O(V) | O(degree(V)) |
간선 추가/삭제 | O(1) | O(1) 또는 O(degree(V))[1] |
밀집 그래프 표현 | 효율적 | 비효율적 |
희소 그래프 표현 | 비효율적 | 효율적 |
인접 행렬은 모든 정점 쌍에 대한 연결 여부를 상수 시간에 확인할 수 있어 간선 검색이 빈번한 알고리즘에 유리하다. 또한 구현이 직관적이고 밀집 그래프를 표현할 때 공간 낭비가 상대적으로 적다. 반면, 정점 수가 많고 간선이 적은 희소 그래프에서는 대부분의 행렬 원소가 사용되지 않아 메모리 효율이 매우 떨어진다.
인접 리스트는 각 정점에 연결된 간선만을 리스트로 관리하여 희소 그래프를 표현할 때 공간 효율이 극대화된다. 또한 한 정점에 연결된 모든 이웃을 탐색하는 데 걸리는 시간이 해당 정점의 차수에 비례하므로, 깊이 우선 탐색이나 너비 우선 탐색과 같은 그래프 순회 알고리즘에서 일반적으로 더 빠른 성능을 보인다. 다만, 두 특정 정점 사이에 간선이 존재하는지 확인하려면 리스트를 순차 탐색해야 할 수 있다는 단점이 있다.
따라서 그래프 알고리즘을 선택할 때는 그래프의 밀도, 수행할 연산의 종류(예: 간선 조회 vs. 이웃 순회), 그리고 메모리 제약 등을 종합적으로 고려하여 적절한 자료구조를 결정해야 한다.
[2]: 연결 리스트 기반 구현 시 간선 추가는 O(1), 삭제는 탐색 시간이 추가로 소요될 수 있다.
