티스토리 뷰
이 글은 인프런의 영리한 프로그래밍을 위한 알고리즘 강의를 듣고 정리한 내용입니다.
DAG(Directed Acyclic Graph)와 Topological Ordering(위상정렬)
DAG(Directed Acyclic Graph)
- DAG는 방향 사이클(directed cycle)이 없는 방향그래프
예 : 작업들의 우선순위
Topological Ordering(위상정렬)
유향 그래프의 Vertex(꼭지점)들의 변의 방향을 거스르지 않도록 나열하는 것을 의미한다.
선후 관계가 정의된 그래프 구조 상에서 선후 관계에 따라 정렬하기 위해서 위상 정렬을 이용할 수 있다.
정렬의 순서는 유향 그래프의 구조에 따라 여러개의 종류가 나올 수 있다.
위상 정렬이 성립하기 위해서는 반드시 그래프의 순환이 존재하지 않아야 한다.
이 점에서 Directed Acyclic Graph(비순환 유향 그래프)이다.
- DAG에서 노드들의 순서화 V1, V2, ... , Vn.
- 단 모든 에지(Vi, Vj)에 대해서 i<j가 되도록 한다.
위상정렬 알고리즘1 의사코드
TopologicalSort1(G){ for <- 1 to n { 진입 간섭이 없는 임의의 정점 u를 선택한다; A[i] <- u; 정점 u와 v의 진출 간선을 모두 제거한다; } 배열 A[1...n]에는 정점들을 위상정렬되어 있다 }
수행시간 : Θ(n+m)
위상정렬 알고리즘2 의사코드
TopologicalSort2(G){ for each v∈V visited[v] <- NO; make an empty linked list R; for each v∈V if(visited[v] = NO) then DFS-TS(v, R); } DFS-TS(v, R){ visited[v] <- YES; for each x adjacent to v do if(visited[x] = NO) then DFS-TS(x, R); add v at the front of the linked list R; }
- 알고리즘이 끝나면 연결리스트 R에는 정점들이 위상정렬된 순서로 매달려 있다.
수행시간 : Θ(n+m)
소스 코드(Java)
'알고리즘' 카테고리의 다른 글
Kruskal(크루스칼) 알고리즘 (1) | 2017.12.18 |
---|---|
MST(Minimum Spanning Tree, 최소비용신장트리) (0) | 2017.12.17 |
DFS(깊이우선순회) (0) | 2017.12.17 |
BFS(너비 우선 순회) (0) | 2017.12.17 |
Graph Algorithms(그래프 알고리즘) (0) | 2017.12.17 |
댓글