비선형 구조
이번 글은 비선형 구조란 무엇이고 탐색하는 대표적인 방법, 그래프 구현 방법을 설명한다.
비선형 구조란?
i번째 원소를 탐색한 다음 그 원소와 연결된 다른 원소를
탐색 할 때, 다음에 탐색 가능한 원소가 여러 개 존재하는
구조. 일반적으로 트리나 그래프 형태로 자료를 구성할 수 있을 때 해당한다.
비선형 구조에서 탐색 방법
주로 트리나 그래프가 비선형 구조의 대표적인 형태이다.
비선형 구조는 데이터가 순차적으로 있지 않기 때문에 스택이나 큐를 이용해서 탐색을 한다.
비선형 구조에서 키워드
- 데이터가 있는 곳: 노드(node)/정점(vertex)
- 데이터를 잇는 선: 간선(edge)/링크(link)
간선은 화살표 유무에 따라 양/단방향으로 표현 가능하고, 간선에는 가중치가 있을 수 있다.
- 정점 b에서 정점 e까지 이동하는데 사용된 간선들의 순서대로 만들어지는 집합을 경로라고 한다.
- 회로(cycle): 경로에 순환이 생기는 것
- 자기간선(loop): 자기자신을 연결하는 간선
- 다중간선(multi edge): 동일한 다른 정점과 여러 간선이 연결되는 경우
- 차수(degree): 한 정점에서 다른 정점으로 가는 모든 간선의 수
그래프 구현 방법
그래프 구현 방법에는 각 정점들의 관계들을 나타내기 위해서 데이터 구조를 쓰는데, 인접행렬과 인접리스트 방식이 있다.
인접행렬은 2차원 배열에 정점들의 관계를 적어주면 된다.
인접리스트는 리스트에 관계를 적어주면 된다.
1. 인접행렬(adjacency matrix)
- 특징
- 양방향 그래프 일 때, 행렬에 대칭성이 나타난다.
- 장점
- 구현이 쉽다.
- 단점
- 메모리 낭비가 심하다.
- 인접리스트에 비해 속도가 느리다.
구현 방법
#include <stdio.h>
int n, m, G[101][101];
int main()
{
scanf("%d %d", &n, &m);
for (int i = 0; i < m; ++i)
{
int a, b, w;
scanf("%d %d %d", &a, &b, &w);
G[a][b] = G[b][a] = w; // 양방향 그래프 일때
}
}
2. 인접리스트(adjacency list)
- 장점
- 속도가 인접행렬보다 빠르다.
- 단점
- 구현이 STL 안 쓰면 인접행렬보다 어렵다. - 하지만 Vector를 쓰면 쉽다.
구현 방법(양방향 그래프 기준으로 작성됨)
#include <vector>
struct V
{
int w; // weight
int next;
};
std::vector<V> G[101];
int n, m;
int main()
{
scanf("%d %d", &n, &m);
for (int i = 0; i < m; ++i)
{
int a, b, w;
scanf("%d %d %d", &a, &b, &w);
G[a].push_back({w, b});
G[b].push_back({w, a});
}
}
시간 복잡도 비교
인접 행렬: O(V*E) < 인접 리스트: O(V+E)
더 읽어 볼만한 주제
'개발' 카테고리의 다른 글
함수 매개변수 작성 시 주의점 (0) | 2019.05.05 |
---|---|
함수 포인터 (0) | 2019.05.05 |
2의 2000승 출력하기(C/C++) (0) | 2018.05.15 |
거듭제곱 빠르게 계산하기 (0) | 2018.05.07 |
선형 구조의 탐색 (0) | 2018.05.05 |
삽입 정렬 - Insertion Sort (0) | 2018.05.03 |
댓글