Job Scheduling
- 문제 정의
- N개의 일들이 있다. J1,J2,,...Jn으로 정의한다.
- 각각의 일 Ji=(Si,Ti)
- Si=시작시간(Deadline)
- Ti=끝나는시간(Profit)
- 얼마나 많은 일을 할 수 있는가?
해결
- 끝나는 시간을 기준으로 넣으면 된다.
- 현재 시간보다 Si가 높거나 같은 일들 중 Ti가 가장 낮은 일을 골라서 넣으면 된다.
- 기준에 충족하는 Ji를 넣을 때, 아직 들어가지 않은 일 Jk의 경우는 다음과 같다.
- Si가 현재 시간보다 낮음 : 고려 대상이 아님
- Si가 현재 시간보다 높고, Ti가 높음 : Ji의 끝나는 시간과 Jk의 끝나는 시간의 차이가 있으므로, 그 시간만큼 손해를 봄.
- Si가 현재 시간보다 높고, Ti가 낮음 : Jk를 넣으면 됨. 다른 말로 모순임(우리 알고리즘을 수행한 게 아님)
참고
Tape Storage
- 문제 정의
- N개의 데이터가 있다. 매개변수 Li, Fi가 있다.
- Li=데이터의양(테이프의길이)
- Fi=사용빈도
- 읽기와 쓰기
- 쓰는 건 한번뿐이다.
- 읽는 건 여러번 할 수 있다.
- 읽을 때는 무조건 처음부터 읽는다.
알고리즘
- Li가 크면 뒤에 있어야 한다. 앞에 있으면 많이 읽히므로 데이터 소모가 크다.
- Fi가 크면 앞에 있어야 한다. 자주 사용되기 때문에 빨리 끝나기 때문이다.
그러므로 LiFi이 큰 순서로 앞에서부터 배치한다. 별 문제가 없어보인다. 하지만 다른 대안들이 여러가지가 있다.
- Li2Fi2
- Fi−Li
- ...
Correctness
- LiFi<Li+1Fi+1
테이프의 i 와 i+1을 교환 후 기댓값
F1L1+...+Fi(L1+...+Li)+Fi+1(L1+...+Li+Li+1)
F1L1+...+Fi+1(L1+...+Li−1+Li+1)+Fi(L1+...+Li−1+Li+1+Li)
서로 빼면 사라지고
Fi+1Li−FiLi+1
= LiLi+1(Li+1Fi+1−LiFi)>0
(Li+1Fi+1−LiFi)>0
이 말이 의미하는 것은 LiFi는 i가 증가할수록 커진다는 의미이며 데이터 소모량이 증가한다는 의미와도 같다.