위상 정렬 (Topological Sort)
쉽게 풀면
대학교 수강신청을 떠올려 보세요. "자료구조"를 들어야 "알고리즘"을 들을 수 있고, "알고리즘"을 들어야 "고급알고리즘"을 들을 수 있다면, 이 선후관계를 어기지 않는 수강 순서표를 만들어야 합니다. 위상 정렬은 바로 이렇게 여러 개의 '이것 다음에 저것' 규칙이 있을 때, 모든 규칙을 동시에 만족하는 하나의 순서를 찾아주는 방법입니다. 단, 이 방법은 순환(A가 B의 선행조건이면서 동시에 B가 A의 선행조건인 경우)이 없는 그래프에서만 가능합니다.
왜 중요한가
많은 실무·연구 시스템이 작업 간 의존 관계를 방향 비순환 그래프로 표현하기 때문에, 위상 정렬은 컴파일러의 빌드 순서 결정, 딥러닝 프레임워크의 연산 그래프 실행 순서, 스케줄링·프로젝트 관리 알고리즘의 기초 연산으로 폭넓게 쓰입니다. 그래프 알고리즘 논문에서는 이를 더 복잡한 문제(경로 최적화, 병렬 스케줄링 등)를 푸는 전처리 단계로 자주 활용합니다.
논문에서는 이렇게 쓰입니다
이 문장은 여러 작업 사이에 "이 작업이 끝나야 저 작업을 시작할 수 있다"는 제약이 있을 때, 그 제약을 모두 지키면서 전체 작업을 처리할 수 있는 순서를 자동으로 계산했다는 뜻입니다. 빌드 시스템의 컴파일 순서, 프로젝트 일정 관리, 신경망 계층 연산 순서 결정 등에 널리 쓰입니다.
딥러닝 프레임워크 내부에서 계산 그래프를 실행 가능한 순서로 배치할 때 위상 정렬이 활용되는 예시입니다.
소프트웨어 패키지 의존성 해석에서 위상 정렬이 순환 탐지와 설치 순서 결정을 동시에 수행하는 데 쓰이는 사례입니다.
조금 더 깊게 보면
위상 정렬을 구현하는 대표적인 방법은 진입 차수(in-degree)가 0인 노드부터 큐에 넣어 차례로 제거하는 칸(Kahn) 알고리즘과, 깊이 우선 탐색(DFS)이 끝나는 순서를 뒤집어 사용하는 방식 두 가지입니다. 두 방식 모두 시간 복잡도는 노드와 간선 수에 선형으로 비례하며, 순환이 존재할 경우 칸 알고리즘에서는 큐가 비기 전에 처리되지 않은 노드가 남고 DFS 방식에서는 역방향 간선이 검출되어 순환 여부를 함께 판별할 수 있습니다.
주의할 점
위상 정렬은 그래프에 순환이 존재하면 애초에 불가능하며, 같은 그래프라도 정답이 되는 순서가 하나가 아니라 여러 개일 수 있습니다. 크루스칼 알고리즘처럼 그래프에서 사이클 발생 여부를 빠르게 검사할 때는 유니온-파인드 자료구조가 함께 쓰이기도 합니다.