티스토리 뷰

Algorithm

위상 정렬 (Topological Sort)

snail voyager 2022. 10. 1. 23:53
728x90
반응형
처리해야할 여러가지 일들이 있고, 이들 사이의 선후 관계가 있는 그래프.
DAG (Directed Acyclic Graph, 방향성이 있으며 사이클이 없는 그래프)  조건.

 

  • 진입 차수(indegree)를 이용한 정렬
  • 탐색큐, 결과큐 사용 시간복잡도 O(|V|+|E|)
  • 진입 차수가 0이 아닌 정점이 남아 있으면 사이클이 있는 그래프

위상 정렬의 핵심 아이디어

위상 정렬은 노드들 간의 의존 관계를 고려하여 모든 노드를 순서대로 나열하는 과정입니다. 

예를 들어, 코스 수강 문제에서 A → B가 있으면, A를 먼저 수강해야 하고 그 후에 B를 수강할 수 있습니다. 

따라서 위상 정렬은 이와 같은 의존 관계를 가진 작업들을 순서대로 나열하는 방식입니다.

위상 정렬의 활용

작업 스케줄링: 여러 작업 간의 의존성을 만족시키면서 작업을 순서대로 실행하는 데 사용됩니다.

코스 스케줄링 문제: 특정 과목을 듣기 위해 다른 과목을 먼저 들어야 하는 상황에서 과목을 들을 수 있는 순서를 정합니다.

컴파일러: 모듈 간 의존 관계가 있을 때, 모듈을 어떤 순서로 컴파일해야 하는지 결정할 때 사용됩니다.

//V : 정점집합, E : 간선집합, Q : 탐색큐
//Adj[v] : 정점 v의 인접 정점 리스트
//indegree[v] : v의 진입차수
//resultQ : 정렬된 정점

//각 정점의 진입차수 계산 선행

for (v : V)
	if (indgree[v] == 0)	//간선이 없는(indegree가 0인) 정점을 큐에 모두 넣기
    	Q.offer(v); resultQ.offer(v);
        
while (!Q.isEmpty())
	v = Q.poll();
    for (인접정점 u : Adj[v])
    	indegree[u]--;		//이전 정점은 지나갔으니 진입 차수 차감
        if (indegree[u] == 0)	//진입차수가 0이면 큐에 넣기
        	Q.offer(u); resultQ.offer(u);

 

728x90
반응형

'Algorithm' 카테고리의 다른 글

Divide and Conquer vs. Dynamic Programming  (0) 2024.09.22
Trie (트라이)  (0) 2024.08.31
멱집합 Power Set  (0) 2020.04.20
순열, 조합, 중복순열, 중복조합  (0) 2020.04.16
최단 경로 알고리즘 - Floyd Warshall  (0) 2020.04.05
반응형
300x250