아래 글은 'Introduction to Algorithms(한빛아카데미)'와 위상 정렬 개념 및 구현를 보고 작성한 것이다.
위상 정렬을 알기 위해서는 먼저 '방향 비순환 그래프(DAG)'에 대해 알고있어야 한다.
방향 비순환 그래프(Directed Acyclic Graph): DAG는 말 그대로, 사이클이 없는 방향 그래프이다. DAG는 보통 이벤트/객체 간의 우선순위를 나타내기 위해 사용된다.
DAG인 그래프 G = (V, E)의 위상 정렬은 G가 간선 (u, v)를 가질 때, u가 v보다 순서상으로 먼저 나타나도록 모든 노드를 선형으로 나열하는 것이다. 즉, 우선순위에 따라 배열을 정렬하는 것이다. 따라서 우선순위 사이에 순환이 있어서는 안된다. 그래프가 순환을 가진다면 우선순위를 매기는 것은 불가능하다. 즉, 그래프가 DAG가 아닌 경우 위상 정렬이 불가능하다.
그래프의 위상 정렬은 모든 방향 간선이 왼쪽에서 오른쪽으로 향할 수 있도록 수평선을 따르는 정점의 나열이라고 볼 수 있다. 그러므로 위상 정렬은 통상적인 정렬과는 다르다.
BFS 방식은 in degree가 필요하다.
DFS 방식은 in degree가 필요없다. 대신 재귀를 사용한다.
깊이 우선 탐색(DFS)는 theta(V + E) 시간이 걸리고 리스트 앞쪽에 |V|개의 정점을 각각 삽입할 때 O(1) 시간이 걸리므로, 위상 정렬은 theta(V + E) 시간에 수행할 수 있다.