DAG, Directed Acyclic Graph
방향그래프
Last updated
방향그래프
Last updated
방향 그래프에서는 1-> 2로 갈 수 있다고 해서 2->1 로의 이동을 보장할 수는 없다.
DAG는 방향 사이클이 없는 그래프를 의미한다.
예를 들어 집짓는 작업의 우선순위를 보자
땅사기, 기초공사하기, 기둥 세우기, 벽돌 쌓기, 도배하기, 전기공사하기
<도배를 하기 전에 전기공사를 해야한다> 처럼 순서가 존재한다.
이 경우, A (전기공사)-> B (도배)처럼 방향을 정의할 수 있다.
작업의 우선순위에서 방향 사이클이 만들어 진다면, 순회할 수 있게 되면서 작업이 영원히 완료되지 않게 된다. 즉, 성립될수가 없다.
DAG의 노드들을 순서화하여 정렬하는 것을 말한다. 이때 모든 에지들은 왼쪽 -> 오른쪽 순서대로 나열해야한다. 먼저 작업하는 것의 순서대로 나열하는 것!
한 노드에 대해서 들어오는 엣지를 incoming, 나가는 엣지를 outgoing 이라고 하고,
들어오는 엣지의 개수를 indgree, 나가는 엣지의 개수를 outdegree 라고 한다.
indegree = 0 의 의미는 결국, 현재 작업 전에 반드시 해야하는 선행작업이 없다는 것이다.
그렇다면, indegree=0 인 노드는 시작점이 될 것이다. 아래의 경우, a 혹은 g가 될 수 있다.
a부터 한다고 하면, a를 제거하고, a에서 나가는 엣지를 제거한다.
다음 번 indegree=0 인 노드 g 역시 제거한 뒤, g에서 나가는 엣지를 제거한다.
이렇게 되면, 노드 d가 이번에는 indgree=0 이 되므로, d를 제거하고 d에서 나가는 엣지를 제거한다.
다음은 f, e, c, b 등의 순서로 사라질 것이다.
문제점 1. indegree=0 인 노드가 존재하지 않으면
문제점 2. indegree=0 을 어떻게 찾을 것인가
문제점 3. 코드 상에서 실제로 정점과 진출간선을 어떻게 제거할 것인가
위상정렬 알고리즘 1이 제일 첫번째 요소를 먼저 찾는 알고리즘이라면, 위상정렬 2 알고리즘은 제일 마지막 요소를 먼저 찾는 알고리즘이다.
노드에서 outgoing edge 가 없는 경우라면, 위상정렬 선상에서 마지막 요소일 확률이 크다.
해당 작업보다 나중에 해야할 작업이 없다는 의미이므로!