[ALGO] Lect14. 의존관계가 정의된 과제 그래프 모델링과 위상정렬 및 임계경로
교수: 성균관대학교 소프트웨어학과 허재필 교수님
사이트: http://www.kmooc.kr/courses/course-v1:SKKUk+SKKU_46+2021_T1/course/
이번 시간에는
DAG 구조와 활용 분야
Directed Acyclic Graph, DAG
DAG는
■ 특징
-
vertex $v_j$→ $v_k$인 경로가 존재한다면, $v_k$→$v_j$인 경로는 존재하지 않는다.
(∵ 존재한다면, acyclic의 규칙이 깨지므로)
Topological Sort
■ 배경
주어진 작업 셋 간에 dependencies(의존성)이 있는 경우,
■ 특징
Topological Sorting의 결과는
■ 응용
- 외출하기위해 옷을 입는 순서 (속옷→바지→티셔츠→…)
- 여러 개의 소스코드로 이루어진 프로그램의 컴파일 순서 결정
- 선행과목을 포함한 수강신청 (CS Basics→C Programming→Algorithms→…)
Algorithm
DAG $V$에 대해
-
DAG $V$를 복사하여 DAG $W$에 저장한다.
-
아래의 과정을 반복한다 :
-
DAG $W$ 내의
$\text{in-degree}=0$인 vertex $v$를 조사 한다. (즉, source인 vertex)※ in-degree는 vertex를 기준으로 들어오는 화살표를 의미한다. ※ -
source에 해당하는 vertex $v$를
topological sort의 다음 순서에 넣는다. -
DAG $W$에서
vertex $v$를 제거 한다.
-
Example
아래와 같이 12개의 vertex로 구성된 DAG를 Topological Sort한 결과를 구하라.
Result:
\[C,H,\ D,I,\ A,J,\ B,F,\ G,K,\ E,L\]※ vertex 선택 순서에 따라 topological sort의 결과는 달라질 수 있다. ※
Implementation
-
Initialization
Type array[vertex_size]; int ihead = 0, itail = -1;
-
Testing if empty:
ihead == itail + 1
-
For push
itail++; array[itail] = new vertex;
-
For pop
Type current_top = array[ihead]; ihead++;
Analysis
- vertex의 in-degree의 개수를 기록하는 table을 초기화: $Θ(V)$
- 아래의 과정을 $V$번 반복: $Θ(V)$
- $\text{in-degree}=0$인 vertex를 찾기위해 in-degree table을 스캔 : $O(V)$
- 발견한 source vertex들을 queue에 모두 push && pop : $Θ(V)$
- source vertex들의 neighbors의 in-degree값에 -1 연산을 수행 :
- adjacency matrix를 사용하는 경우: $Θ(V)$
- adjacency list를 사용하는 경우: $Θ(E)$
최종적으로 (adjacency list를 사용하는 경우) Topological Sorting은 다음의 complexity를 갖는다.
- adjacency list를 사용하는 경우, $Θ(\lvert{V}\rvert+\lvert{E}\rvert)$.
- adjacency matrix를 사용하는 경우, $Θ(\lvert{V}\rvert^2)$.
- memory requirements = $Θ(\lvert{V}\rvert)$.
Critiacal Path, 임계 경로
■ 주요 아이디어
아래와 같은 dependency를 갖는 tasks가 주어졌을 때,
-
한 번에 하나의 작업만 수행 가능한 경우:
A→B→C→D→E의 순서로(사실 어떤 순서든 상관이 없다) 작업을 처리한다면 총 소요시간은 다음과 같다.
\[0.3+0.5+0.4+0.1+0.7=2.0(\text{sec})\] -
B와 D를 동시에 수행할 수 있는 경우(
병렬처리 ):(B,D)→A→C→E
\[\max(0.7,\ \min{(0.7, 0.5)}+0.3+0.4+0.1)=1.3(\text{sec})\]※ 모든 Tasks가 끝나는 가장 빠른 시간을 Critical Time이라고 한다. ※
※ Ciritical Time에 해당하는 경로를 Critical Path라고 한다. ※
Algorithm
전체 tasks가 끝나기 위해서는 39.4sec의 시간이 소요되고, 각각의 task는 다음의 Ciritical Time을 갖는다.
A | B | C | D | E | F |
---|---|---|---|---|---|
5.2 | 11.3 | 31.3 | 39.4 | 26.6 | 17.1 |
Ciritical Path는
이 Critical Path가 tasks를 모두 수행하기 위해 가장 오래 걸리는 tasks에 대한 순서이다. 따라서
References
- [집콕]인공지능을 위한 알고리즘과 자료구조: 이론, 코딩, 그리고 컴퓨팅 사고-비선형 자료구조, K-MOOC: http://www.kmooc.kr/courses/course-v1:SKKUk+SKKU_46+2021_T1/courseware/1158909c057347478d7386a2b7e97214/e9d736660cad4f76bcb9a05974fe0bf2/1?activate_block_id=block-v1%3ASKKUk%2BSKKU_46%2B2021_T1%2Btype%40vertical%2Bblock%4052b62ff6da2147c9a8a65a6056681d91