일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- const 단언문
- 폰트적용하기
- 커스텀
- 반복줄이기
- 레이아웃쪼개기
- 티스토리꾸미기
- utilty type
- 타입스크립트
- javascript
- 개발콘텐츠
- JS console
- 공통컴포넌트
- NonNullable
- TSDoc
- 리액트
- vue.js
- click and drag
- 누구나 자료구조와 알고리즘
- typescript
- react
- React.js
- React Native
- 타입좁히기
- 제네릭
- reactjs
- returnType
- Chart.js
- 성능최적화
- CSS
- 2022
- Today
- Total
몽땅뚝딱 개발자
누구나 자료구조와 알고리즘 - (13) 그래프 본문
그래프
모든 트리는 그래프이다.
1.1 그래프 vs. 트리
- 그래프는 서로 순환적으로 참고하는 노드가 있을 수 있으나 트리는 사이클이 있을 수 없다.
- 트리는 간접접으로라도 다른 노드와 연결되지만 그래프는 완전히 연결되지 않을 수 있다.
1.2 용어
- 정점(vertex): 각 노드를 정점이라고 한다.
- 간선: 정점을 잇는 선
- 인접한다: 간석으로 연결된 정점에 대해 서로 인접한다고 말한다.
- 이웃: 인접한 정점
예제 1. 그래프를 해시테이블로 구현하기
friends = {
"Alice" => ["Bob", "Diana", "Fred"]
"Bob" => ["Alice", "Diana"]
"Diana" => ["Bob"]
"Fred" => ["Bob"]
}
1.3. 그래프 탐색
정점 찾기는 가장 흔한 그래프 연산 중 하나이다. 그래프에서 탐색은 그래프 어딘가에 있는 특정 정점을 찾는 것이다. 배열에서 값을 찾거나 해시 테이블에서 키-값 쌍을 찾는 것과 비슷하다. 하지만 탐색은 그래프에서 보다 특정한 의미를 갖는데, 그래프 내 한 정점에 접근할 수 있을 때 그 점점과 어떻게든 연결된 또 다른 특정 정점을 찾는 것이다.
그래프 탐색에는 깊이 우선 탐색과 너비 우선 탐색 두 방식이 널리 쓰인다.
1.3.1 깊이 우선 탐색
사이클이 있는 그래프는 모두 연결되어 있기 때문에 앞서 방문했던 정점을 기록하지 않으면 영원히 순환할 수 있다. 따라서 해시 테이블을 사용하여 정점을 방문할 때 마다 Boolean 같은 값을 사용하여 키에 할당하는 방법으로 해결할 수 있다.
1. 재귀적으로 아래로 내려가며서 탐색한다.
2. 하위에 정점이 있는 경우나 이웃이 있는 경우 호출스택에 추가해가며 깊이 우선 탐색을 재귀적으로 수행하고 모두 수행한 뒤에 더 이상 순회할 이웃이 없는 경우 하나씩 팝한다.
3. 방문한 경우 방문했다는 키를 할당한다.
4. 모든 정점마다 모든 이웃을 순회한 경우 끝이 난다.
1.3.2 너비 우선 탐색
깊이 우선 탐색과 달리 너비 우선 탐색은 재귀를 쓰지 않고 큐로 문제를 해결한다.
1. 시작 정점(루트)에 있는 인접 정점을 모두 순회하고 스택에 추가한다.
2. 그 다음 첫번째 항목을 삭제하고 삭제한 항목의 인접 정점을 순회한다.
3. 방문하지 않은 정점을 스택에 추가한다.
4. 방문한 경우 방문했다는 키를 할당한다.
5. 큐가 빌 때 까지(=모두 순회했다는 뜻) 2-4단계를 반복한다.
1.3.3 깊이 우선 탐색 vs. 너비 우선 탐색
너비 우선 탐색은 시작 정점과 가장 가까운 정점을 모두 순회한 후 멀어진다.
깊이 우선 탐색은 즉시 시작 정점에서 최대한 멀어진다.
따라서 그래프를 탐색하는 동안 시작 정점 가까이 있고 싶은 경우 너비 우선 탐색을, 빠르게 멀리 떨어져야한다면 깊이 우선 탐색을 선택한다.
1.3.4 빅오로 표현하기
O(V + 2E)이다. 하지만 빅 오에서는 상수를 버리므로 O(V + E)로 나타낸다.
V는 정점을 뜻하고 E는 간선 수를 뜻한다.
출처
제이 웹그로우, 누구나 자료구조와 알고리즘 (길벗, 2021)
개인적으로 공부한 내용을 정리하는 블로그로
잘못된 개념을 게시하지않도록 주의하고 있으나 오류가 있을 수 있습니다.
'Development > 알고리즘' 카테고리의 다른 글
[프로그래머스 | Javascript] Lv.1 추억 점수 (0) | 2023.10.09 |
---|---|
누구나 자료구조와 알고리즘 - (14) 공간 제약 다루기, 코드 최적화 기법 (0) | 2023.10.03 |
⭐️ 누구나 자료구조와 알고리즘 - (12) 노드 기반 자료구조: 트리(Tree) - 힙(Heap), 트라이(trie) (0) | 2023.10.01 |
누구나 자료구조와 알고리즘 - (11) 노드 기반 자료구조: 연결 리스트 (0) | 2023.09.29 |
누구나 자료구조와 알고리즘 - (10) 퀵 정렬(Quicksort) (0) | 2023.09.29 |