728x90
반응형
그래프 이론 알고리즘
정점들과 간선들로 이루어진 집합을 "그래프"라고 한다.
그래프는 노드와 간선으로 표현되며 이때 노드를 정점이라고도 표현한다.
그래프의 종류
- 트리 : 부모, 자식 계층 구조를 가진다. (특징 : 간선 수 = 노드 수 - 1)
- 이진트리 : 각 노드의 자식 노드 수가 2개 이하로 구성되어 있는 트리를 의미한다.
정 이진 트리 | 자식 노드가 0 또는 2개인 이진 트리를 의미 한다. |
완전 이진 트리 | 왼쪽부터 채워져 있는 이진트리, 마지막 레벨을 제외하고는 모든 레벨이 완전히 채워져 있으며 마지막 레벨의 경우 왼쪽부터 채워져 있다. |
변질 이진 트리 | 자식 노드가 하나밖에 없는 이진 트리를 의미한다. |
포화 이진 트리 | 모든 노드가 꽉 차 있는 이진 트리를 의미한다. |
균형 이진 트리 | 모든 노드의 왼쪽 하위 트리와 오른쪽 하위트리의 차이가 1이하인 트리이다. Ex) 레드 블랙 트리 |
- 이진 탐색 트리 : 오른쪽 하위 트리에는 노드의 값보다 큰 값이 있는 노드만 포함되고 왼쪽 하위트리에는 노드의 값보다 작은 값이 들어 있는 트리를 의미한다. => 왼쪽에는 작은 값, 오른쪽에는 큰 값으로 구분되어 있어 검색에 용이하다.
- 이진 탐색트리의 시간 복잡도 : O(logN)
그래프의 구현과 탐색 방법
- 인접 행렬(Adjacency Matrix) : 2차원 배열에 각 노드가 연결된 형태를 기록하는 방식
- 인접 리스트(Adjacency List) : 리스트로 그래프의 연결관계를 표현하는 방식
1. 인접 행렬
- 그래프에서 정점과 간선의 관계를 나타내는 Bool Type의 정사각형 행렬을 말한다.
- 0은 두 정점 사이의 경로가 없음을 의미하며 1은 두 정점 사이의 경로가 있음을 의미한다.
- 위의 무방향(양방향) 그래프를 인접 행렬로 표현하면 아래와 같다.
0 | 1 | 2 | 3 | |
0 | 0 | 1 | 0 | 1 |
1 | 1 | 0 | 1 | 1 |
2 | 0 | 1 | 0 | 0 |
3 | 1 | 1 | 0 | 0 |
장점 : 2차원 배열에 모든 노드들의 간선 정보가 있기 때문에, 두 노드를 연결하는 간선을 조회할 때 O(1)의 시간 복잡도를 가진다.
단점 : 간선의 수와 무관하게 항상 n^2크기의 2차원 배열이 필요하므로 메모리 낭비가 심하다. 그래프의 모든 간선의 수를 알아내려면 인접행렬 전체를 확인해야 하므로 O(n^2)의 시간이 소요된다.
2. 인접 리스트
- 그래프의 각 노드에 인접한 노드들을 연결리스트(Linked List) 로 표현하는 방법이다.
- 노드의 개수만큼 인접 리스트가 존재하며 각 인접 리스트에는 인접한 노드 정보가 저장된다.
- 그래프는 각 인접 리스트에 대한 헤드 포인터를 배열로 갖는다.
- 위의 무방향(양방향) 그래프를 인접 리스트로 표현하면 아래와 같다.
장점 : 존재하는 간선만 관리 -> 메모리 사용이 효율적이다.
단점 : 두 노드를 연결하는 간선을 조회하거나, 노드의 차수를 조회하기 위해서는 노드의 인접 리스트를 탐색해야 하므로 노드의 차수만큼 시간이 필요하다.
인접 행렬 VS 인접 리스트
인접 행렬 | 인접 리스트 | |
간선 (u, v) 검색 | O(1) | O(degree(v)) |
정점(v)의 차수 계산 | O(n) | O(degree(v)) |
전체 노드 탐색 | O(n^2) | O(e) |
메모리 | n*n | n+2 |
구현 | 쉬움 | 어려움 |
전체 정점 개수 : n
전체 간선 개수 : e
그래서,
그래프가 희소할 때는 인접리스트, 조밀할 때에는 인접 행렬이 좋다.
: 그래프가 희소할 때 인접 행렬이 인접 리스트보다 메모리를 더 많이 사용해야한다. 간선이 없어서 인접행렬의 대부분의 요소가 0인데도 2차원 배열을 만들게되면 해당 부분을 포함하여 2차원 배열이 만들어지기 때문이다.
: 그래프가 조밀할 때 인접행렬이 인접 리스트보다 좋다. 대부분의 노드가 연결되어 있기 때문에 메모리의 낭비가 없이 효율성은 동일해지고 정점 i에서 정점 J 까지의 간선이 있는지 확인하는 속도가 더 빠르기 때문에 인접 행렬이 더 빠르다
그래프 문제 LV3
https://school.programmers.co.kr/learn/courses/30/lessons/49189
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
[프로그래머스] 가장 먼 노드 by 파이썬(Python) : 그래프 bfs
https://school.programmers.co.kr/learn/courses/30/lessons/49189 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는
h-castle.tistory.com
728x90
반응형
'알고리즘 > 개념' 카테고리의 다른 글
[트리 순회] 알고리즘 - 트리 순회 (0) | 2023.07.28 |
---|---|
[BFS] 알고리즘 - 너비 우선 탐색 (BFS, Breadth First Search) (0) | 2023.07.27 |
[DFS] 알고리즘 - 깊이 우선 탐색 (DFS) (0) | 2023.07.26 |
[구현] 알고리즘 - 구현 (Implementation) (0) | 2023.07.24 |
[누적합] 알고리즘 - 누적합(Prefix Sum) (0) | 2023.07.23 |