작업 스케줄링(Task Scheduling)
기계에서 수행되는 n개의 작업들을 수행 시간이 중복되지 않도록 가장 적은 수의 기계에 배정하는 문제이다.
각 작업은 시작시간과 종료시간이 정해져있다.
발표 시간이 정해진 학술대회에서 발표자들을 강의실에 배정하는 문제와 같다.
알고리즘
다음과 같은 그리디 알고리즘이 존재한다.
빠른 시작 시간 작업 우선 (Earliest Start Time First)
빠른 종료 시간 작업 우선 (Earliest Finish Time First)
짧은 작업 우선 (Shortest Job First)
긴 작업 우선 (Longest Job First)
여기서는 최적해를 찾기 위해 첫 번째 방법을 선택한다.
빠른 시작 시간 작업 우선 (Earliest Start Time First)
Pseudo Code
JobScheduling(Task *arr) { Task list[] = arr를 시작 시간을 기준으로 오름차순 정렬한 배열 while (list에 원소가 존재하면) { t_i = (가장 이른 시작 시간을 가진 작업); if (t_i를 수행할 기계가 존재하면) t_i를 해당 기계에 배정한다. else 새로운 기계에 t_i를 배정한다. t_i를 list에서 제거한다. } return 각 기계에 배정된 작업 순서 }
예제
시작 시간과 종료 시간을 [start time, end time]이라고 표기한다.
t1 = [7, 8]
t2 = [3, 7]
t3 = [1, 5]
t4 = [5, 9]
t5 = [0, 2]
t6 = [6, 8]
t7 = [1, 6]
시작 시간을 기준으로 오름차순 정렬하여 list에 저장하면 다음과 같다.
list = { [0, 2], [1, 5], [1, 6], [3, 7], [5, 9], [6, 8], [7, 8] }
시간 복잡도
배열을 정렬할 때 O(nlogn) 시간이 걸린다.
사용된 기계의 수를 m이라고 하면, 루프 내부에서 기계를 찾을 때의 시간 복잡도는 O(m)이다.
- 루프가 n번 반복되므로 총 O(mn)이다.
따라서 총 시간 복잡도는 O(nlogn) + O(mn)이다.
'Algorithm > 알기 쉬운 알고리즘' 카테고리의 다른 글
04. 그리디(Greedy) 알고리즘 (0) | 2021.05.03 |
---|---|
집합 커버 문제 (Set Cover Problem) (0) | 2021.05.03 |
부분 배낭 문제 (Fractional Kanpsack Problem) (0) | 2021.05.03 |
최단 경로 찾기(Shortest Path) (0) | 2021.05.03 |
최소 신장 트리(Minimum Spanning Tree) (0) | 2021.05.03 |