일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 알고리즘
- C++최적화
- 선택정렬
- 언리얼가비지컬렉터
- UE4 커스텀로그
- 자료구조
- 델리게이트
- UML관련
- 약참조
- 정렬
- UE_LOG
- 강참조
- 스마트포인터
- stl
- 프로그래머스
- C++
- enumasByue
- UELOG
- 크리티컬섹션
- map
- moreeffectiveC++
- 애셋로드
- 언리얼엔진구조체
- unorder_map
- 람다사용정렬
- 정렬알고리즘
- 람다
- BFS
- dataasset
- 데이터애셋
- Today
- Total
기억을 위한 기록들
[알고리즘] 위상정렬(Topological Sort) 본문
위상이란??
즉, 어떤 정점이 다른 사물과의 관계 속에서 가지는 위치나 상태를 말한다.
그래프안에서 인접해 있는 정점 사이의 관계의 '위치'라는 속성이 존재. 그러므로 위상 정렬이 가능하려면, 첫째로 그래프에 방향성이 있어야하고, 둘째로는 그래프내에 사이클이 있어야한다. 이러한 그래프를 DAG(Directed Acyclic Graph)라고 한다.
DAG 그래프 예
위상정렬은 두 정점이 이웃 또는 인접관계에 있다는 사실뿐만 아니라 간선이 방향성을 가지는 경우에는 어느 정점이 선이고 어느 정점이 후인지도 설명합니다.
정점은 두 가지 종류의 방향성 간선을 가질 수 있는데 그중 하나는 정점으로 들어가는 진입간선과 다른 하나는 진출 간선입니다.
1. 리스트 하나를 준비
2. 그래프에서 진입 간선이 없는 정점을 리스트에 추가, 해당 정점 자신과 진출 간선을 제거.
3. 모든 정점에 대해 2를 반복하고 그래프내에 장점이 남아 있지 않으면 정렬을 종료한다. 이때 리스트에는 위상 정렬된 그래프가 저장.
이런식으로 진행한다. 하지만 더 유용한 방법은 깊이우선탐색(DFS)와 함께 사용하는것이다.
1. 리스트를 하나 준비
2. 그래프에서 진입 간선이 없는 정점에 대해 깊이 우선 탐색을 시행하고, 탐색 중에 더 이상 옮겨갈 수 있는 인접 정점이 없는 정점을 만나면 이 정점을 리스트의 새로운 '헤드'로 입력합니다.
3. 2번을 반복하다가 더 이상 방문할 정점이 없으면 깊이 우선 탐색을 종료. 깊이 우선 탐색이 끝난 후 리스트에는 위상정렬된 그래프가 저장.
'자 & 알 > 알고리즘' 카테고리의 다른 글
[알고리즘]프림 알고리즘(Prim'a Algorithm) (0) | 2021.01.27 |
---|---|
[알고리즘] 플러드 필(Flood Fill) 알고리즘? (0) | 2021.01.11 |
[알고리즘] 그래프 탐색 2가지 - 깊이 우선 탐색(Depth First Search) & 너비우선탐색(Breadth First Search)/ C++ 구현 (0) | 2021.01.06 |
[알고리즘] 탐색/검색에 관하여 (0) | 2021.01.01 |
[알고리즘] Least Recently Used(LRU) 알고리즘 / [1차] 캐시 (0) | 2020.12.19 |