Transcript Ch04-3
스케줄링 (Scheduling)
시스템 내부시간(time in the system):
• 임의의 작업(Task)이 서비스를 받기 위해 대기하는 시간
+ 실제 서비스를 받는 시간
스케줄링 문제
• 모든 작업의 전체 시스템 내부시간이 최소화 되도록 일정을 구성하는
문제
Page 1
스케줄링 (Scheduling)
스케줄링 문제
• Example: 3개의 작업이 있고, 각 작업에 소요되는 시간이 5, 10, 4이다.
• t1=5, t2=10, t3=4
[1, 2, 3]: 5+(5+10)+(5+10+4) = 39,
[1, 3, 2]: 5+(5+4)+(5+4+10)=33,
[2, 1, 3]: 10+(10+5)+(10+5+4) = 44,
[2, 3, 1]: 10+(10+4)+(10+4+5)=43,
[3, 1, 2]: 4+(4+5)+(4+5+10) = 32,
[3, 2, 1]: 4+(4+10)+(4+10+5)=37.
Page 2
스케줄링 (Scheduling)
스케줄링 문제를 위한 탐욕알고리즘
작업시간별로 작업을 비내림차순으로 정렬한다.
while (답을 구하지 못했음) {
다음 작업을 스케줄에 넣는다; //선택절차&적정성 점검
if (작업이 더 이상 없다)
// 해답 점검
답을 구했음;
}
• 시간복잡도: W(n)(nlgn) why?
정리 4.3
• 시스템 내부의 총 시간이 최소가 되도록 하는 유일한 스케줄은
작업시간별로 작업을 비내림차순으로 짠 스케줄이다.
Page 3
마감시간 있는 스케줄링
마감시간(deadline)이 있는 스케줄링 문제:
• 각 작업을 끝내는 데 1의 단위시간이 걸림
• 각 작업마다 마감시간과 작업 후 발생하는 이익이 할당되어 있음
전체 작업의 시작 시간: 1
마감시간(deadline): 작업이 반드시 시작되어야 하는 마지 노선 시간
“작업 T1의 마감시간이 2이다”의 의미
작업 T1은 시점 1 혹은 2에 시작 가능
“작업 T2의 마감시간이 1이다”의 의미
작업 T2는 시점 1에만 시작 가능
• 총 이익을 최대가 되게 작업의 스케줄을 짜는 문제
Page 4
마감시간 있는 스케줄링
마감시간이 있는 스케줄링 문제:
• Example: 작업의 마감시간과 이익이 다음 표와 같다고 하자. 이 경우
의 가능한 스케줄과 총 이익은 오른쪽과 같다.
최적 스케줄: [4, 1]
이익이 가장 큰 작업 4는 최적 스케줄에 포함되었지만 두 번째로 이익이 큰 작
업 2는 포함되지 않았다.
그 이유는 작업 4와 작업 2의 마감시간이 같아 둘 중 하나만 포함할 수 있기 때
문이다.
Page 5
마감시간 있는 스케줄링
마감시간이 있는 스케줄링 문제를 위한 탐욕알고리즘
작업을 이익이 큰 것 부터 차례로 정렬 (비올림차순)한다.
S = ;
while (답을 구하지 못했음) {
다음 작업을 선택;
//선택절차
if (이 작업을 추가하면 S가 적절하다.) //적정성 점검
이 작업을 S에 추가;
if (작업이 더 이상 없다)
// 해답 점검
답을 구했음;
}
Page 6
마감시간 있는 스케줄링
마감시간이 있는 스케줄링 문제를 위한 탐욕알고리즘
• 예제 4.4
Page 7
허프만 코드
Representation of characters in computer
7 bits/char (ASCII)
2 bytes/char (KSC Hangul)
2 bytes/char (UNICODE)
Isn’t there more efficient way to store text?
Huffman Code: 문자들로 이루어진 데이터 파일을
코드화 하는 방법 중 하나
Data compression based on frequency Huffman Code
Binary coding (0과 1만 사용, 즉 이진 코딩)
Variable length coding (가변 길이 이진 코딩)
Assign short code for characters used frequently
Page 8
허프만 코드
고정 길이 이진 코딩 vs. 가변 길이 이진 코딩
텍스트 파일의 문자 집합: {a, b, c}
고정길이 이진 코딩
a: 00, b: 01, c: 11
ababcbbbc 000100011101010111 (18 비트)
가변길이 이진 코딩
b가 가장 빈번하게 나온다는 것을 안다고 가정 b를 0으로 코딩
a: 10, b:0, c:11 (주의: a를 01로 코딩할 수 없음. Why?)
ababcbbbc 1001001100011 (13 비트)
최적 이진 코딩 문제(Optimal Binary Code)
주어진 파일에 있는 문자들을 이진 코드로 표현하는 데 필요한
비트의 개수가 최소가 되는 이진 문자 코드를 찾는 문제
Page 9
허프만 코드
Huffman code는 prefix code (전치 코드)
문자 코드가 서로 다른 길이를 가질 수 있다.
어떤 문자 코드도 다른 코드의 prefix가 되지 않는다.
즉, 한 문자의 코드워드가 다른 문자의 코드워드의 앞부분이 될 수
없다.
{b, a, c}={0, 10, 11} : prefix code
{a, b}={01, 011} : not prefix code
전치 코드의 장점
전치 코드는 Leaf가 코드 문자로 구성된
이진 트리 (Binary Tree)로 표현 가능
인코딩되어 있는 것을 디코딩할 때 (즉, 복원할 때) 트리의 뿌리에서
1-pass 만에 디코딩이 가능
Page 10
허프만 코드
Huffman code의 예
문자 집합 {a, b, c, d, e, f}에 대한 3가지 코드법
각 코드법을 사용한 결과 인코딩 파일의 총 비트 수
C1: 16 * 3 + 5 * 3 + 12 * 3 + 17 * 3 + 10 * 3 + 25 * 3 = 255
C2: 16 * 2 + 5 * 5 + 12 * 4 + 17 * 3 + 10 * 5 + 25 * 1 = 231
C3: 16 * 2 + 5 * 4 + 12 * 3 + 17 * 2 + 10 * 4 + 25 * 2 = 212
C3 방법이 가장 효율이 좋다.
Page 11
허프만 코드
최적 이진 코딩 문제(Optimal Binary Code)
최적 코드에 해당하는 이진 트리를 구축하여 최적이진문자
코드(Huffman code)를 만드는 문제
Page 12
허프만 코드
최적 이진 코딩 문제(Optimal Binary Code)
priority queue 이용
Top Priority – 빈도수가 가장 작은 문자
내부적으로는 heap으로 구현하는 것이 가장 좋다.
[알고리즘]
priority_queue 에 낮은 빈도수부터 오름차순으로 저장
priority_queue 에서 차례로 두 개를 선택
left와 right child에 배치하고 두 빈도수를 가진 새로운
root 노드를 만들어 binary subtree 를 생성
두 빈도수의 합을 priority_queue 에 삽입
더 이상 진행할 수 없을 때까지 반복
시간 복잡도: Θ(n lgn)
Page 13
허프만 코드
최적 이진 코딩 문제(Optimal Binary Code)
[의사코드]
노드 타입 선언
우선순위 큐 PQ에 있는 nodetype 객체들을 가리키는 n개의
포인터를 다음과 같이 배열한다. PQ의 각 포인터 p에 대해
Page 14
허프만 코드
최적 이진 코딩 문제(Optimal Binary Code)
[의사코드]
복잡도 분석: insert(PQ, r)에서 (lgn)시간 필요. 그러므로
전체적으로 (n lgn) 의 효율을 지님
Page 15
허프만 코드
최적 이진 코딩 문제(Optimal Binary Code)
I:1
Y:1
S:1
0
Y:1
2
I:1
A:2
b:2
Y:1
1
A:2
b:2
M:3
A:2
b:2
M:3
S:1
0
3
M:3
1
0
I:1
2
1
S:1
Page 16
허프만 코드
최적 이진 코딩 문제(Optimal Binary Code)
M:3
3
0
1
Y:1
0
I:1
0
A:2
4
0
2
4
A:2
1
1
b:2
S:1
6
0
1
b:2
0
Y:1
3
1
M:3
1
0
I:1
2
1
S:1
Page 17
허프만 코드
최적 이진 코딩 문제(Optimal Binary Code)
0
10
1
4
0
A:2
6
0
1
b:2
0
Y:1
1
M:3
3
1
0
I:1
2
1
S:1
Page 18
허프만 코드
최적 이진 코딩 문제(Optimal Binary Code)
Page 19
허프만 코드
최적 이진 코딩 문제(Optimal Binary Code)
20
Another Example
문자
빈도
A
2
B
18
C
9
D
30
E
9
F
36
0
104
1
66
38
0
B
1
0
1
20
D
F
B = 00
C = 0111
1
0
D = 10
11
E
0
A
A = 0110
E = 010
1
F = 11
C
문자
빈도
원래(ASCII) 크기
압축된 크기
차이
A
2
7*2=14
4*2=8
6
B
18
7*18=126
2*18=36
90
C
9
7*9=63
4*9=36
27
D
30
7*30=210
2*30=60
150
E
9
7*9=63
3*9=27
36
F
36
7*36=252
2*36=72
180
계
104
728
240
488
Data Structure
Dynamic Programming vs. Greedy Method
탐욕적인 접근방법
동적계획법
최적화 문제를 푸는데 적합
최적화 문제를 푸는데 적합
탐욕적 알고리즘이 존재할 경우
일반적으로 더 효율적
때로는 불필요하게 복잡
알고리즘이 최적인지를
재귀적 속성을 찾고, 최적화 원
증명해야 함
칙이 적용되는지를 점검해야 함
단일출발점 최단경로 문제: (n2)
0-1 배낭 채우기 문제는 풀지 못함
(빈틈없이 배낭 채우기 문제는 해결함)
다중출발점 최단경로 문제:
(n3)
0-1 배낭 채우기 문제를 푼다
Page 21
0-1배낭 채우기 문제 (0-1 Knapsack Problem)(1/2)
문제의 개념적 정의
어떤 도둑이 보석상에서 배낭을 매고 침입했다.
도둑이 똑똑하여 각 보석의 “무게”와 “값어치”를 알고 있다.
훔칠 보석의 총 무게가 용량 W를 초과하면 배낭이 망가진다.
도둑은 총 무게가 W를 초과하지 않으면서 보석들의 총 값어치가
최대가 되도록 보석을 배낭에 담고자 한다.
Page 22
0-1배낭 채우기 문제 (0-1 Knapsack Problem)(2/2)
문제의 정형적 정의
입력:
• 보석 (item)의 개수: n
• 보석 집합 S = {item1, item2,…, itemn}
• wi = itemi의 무게, pi = itemi의 가치
• W = 배낭에 넣을 수 있는 총 무게
문제 정의
item A wi W 를 만족하면서
pi
가 최대가 되도록
A S가 되는 A를 결정하는 문제이다.
i
itemi A
Page 23
0-1배낭 채우기 – 무작정 알고리즘
n개의 아이템에 대해서 모든 부분집합을 다 고려한다.
모든 부분집합들 중에서 총 무게가 W를 초과하는 것들을 버리고,
남은 것들 중에서 총 이익이 최대가 되는 것을 하나 선택한다.
n
그러나, 불행하게도 크기가 n인 집합의 부분집합의 수는 2 개이다.
Page 24
0-1배낭 채우기 – 탐욕적 방법 1
[선택전략] 가장 비싼 물건부터 우선적으로 채운다.
애석하게도 이 알고리즘은 최적이 아니다!
왜 아닌가? 보기: W = 30kg
품목
item1
무게
25kg
값
10 만원
item2
10kg
9 만원
item3
10kg
9 만원
• 탐욕적인 방법: item1 25kg 10만원
• 최적인 해답: item2 + item3 20kg 18만원
Page 25
0-1배낭 채우기 – 탐욕적 방법 2
[선택전략] 가장 가벼운 물건부터 우선적으로 채운다.
마찬가지로 이 알고리즘도 최적이 아니다!
왜 아닌가? 보기: W = 30kg
품목
item1
무게
25kg
값
20 만원
item2
10kg
9 만원
item3
10kg
5 만원
• 탐욕적인 방법: item2 + item3 20kg 14만원
• 최적인 해답: item1 25kg 20만원
Page 26
0-1배낭 채우기 – 탐욕적 방법 3
[선택전략]무게 당 가치가 가장 높은 물건부터 우선적으로 채
운다.
그래도 최적이 아니다!
왜 아닌가? 보기: W = 30kg
품목
무게
값
값어치
item1
5kg
50 만원
10 만원/kg
item2
10kg
60 만원
6 만원/kg
item3
20kg
140 만원
7 만원/kg
• 탐욕적인 방법: item1 + item3 25kg 190만원
• 최적인 해답: item2 + item3 30kg 200만원
더 복잡한 탐욕적 방법을 쓰더라도, 0-1 배낭 채우기 문제는
풀리지 않는다.
Page 27
0-1배낭 채우기 – 동적 프로그래밍 (1/5)
동적 계획법 – 개략적인 전략
wi = itemi의 무게
pi = itemi의 가치
W = 배낭에 넣을 수 있는 총 무게
A를 최적을 이루는 부분집합이라고 가정
A에 item1, item2, item3, … 처럼 item1 부터 차례대로 보석을
(조건을 따져가며) 채운다고 가정
Page 28
0-1배낭 채우기 – 동적 프로그래밍 (2/5)
동적 계획법 – 개략적인 전략
A가 itemn을 포함하지 않는 경우
A는 처음 n-1개 아이템들 중에서 최적을 이루는 부분집합과 동일
A가 itemn을 포함하는 경우
A는 총 무게가 W-wn 을 초과할 수 없다는 제약조건하에서 처음 n-1개
아이템들 중에서 최적을 이루는 부분집합에 itemn이 포함된 결과
최적의 이익 = 처음 n-1개 아이템들로 이루어진 이익 + pn
Page 29
0-1배낭 채우기 – 동적 프로그래밍 (3/5)
i > 0 이고 w > 0일 때, 전체 무게가 w가 넘지 않도록 i번째까지의 항목 중
에서 얻어진 최고의 이익(optimal profit)을 P[i][w]라고 하면, 다음의 재귀
관계식을 얻을 수 있다.
max( P[i 1][ w] , pi P[i 1][ w wi ] ) ( wi w)
P[i ][ w]
( wi w)
P[i 1][ w]
• P[i-1][w]는 i번째 항목을 포함시키지 않는 경우의 최고 이익이다.
• pi + P[i - 1][w - wi]는 i번째 항목을 포함시키는 경우의 최고 이익이다.
Page 30
0-1배낭 채우기 – 동적 프로그래밍 (4/5)
그러면 어떻게 P[n][W]값을 구할 수 있을까?
다음과 같은 2차원 배열을 만든 후, 각 항을 계산하여 채워 넣으면 된다.
• int P[0..n][0..W]
• 여기서 P[0][w] = 0, P[i][0] = 0으로 놓는다.
• 계산해야 할 항목의 수는 nW 이다. 꽤 많은걸?
• 하지만… 뒷 장의 예제를 보자.
Page 31
0-1배낭 채우기 – 동적 프로그래밍 (5/5)
앞선 예에서 P[3][30]을 계산해 보자.
품목
무게
값
값어치
item1
5kg
50 만원
10 만원/kg
item2
10kg
60 만원
6 만원/kg
item3
20kg
140 만원
7 만원/kg
다음과 같이 실제 계산해야 할 항의 수는 많지 않다.
31rd row = P[3][30] max( P[2][30],140 P[2][10]) max(110,140 160) 200
st
P[2][30] max( P[1][30],60 P[1][20]) max(50,60 50) 110
2 row =
P[2][10] max( P[1][10],60 P[1][0]) max(50,60 0) 60
P[1][0] 0
P[1][10] 50
31strd row =
P[1][20] 50
P[1][30] 50
nd
Page 32
0-1배낭 채우기 – 동적 프로그래밍 (5/5)
개선된 알고리즘의 최악의 경우 수행시간을 계산해 보자.
• 앞의 예에서 보듯이 마지막 행에서 최대 2(n-1) 항을 계산한다. (n은 품목 개수)
• 따라서, 총 계산하는 항 수는 1 + 2 + 22 +…+ 2n-1 = 2n - 1이 된다.
• 결국, 계산하는 엔트리 수는 (2n)가 된다.
결국, 최악의 경우 Dynamic Programming 방법의 수행 시간은
n
(2 )이다.
분할정복 방법으로도 이 알고리즘을 설계할 수도 있고, 그 최악의
n
경우 수행시간은 (2 )이다.
아직 아무도 이 문제의 최악의 경우 수행시간이 지수(exponential)
보다 나은 알고리즘을 발견하지 못했고, 아직 아무도 그러한 알고
리즘은 없다라고 증명한 사람도 없다.
Page 33
배낭 빈틈없이 채우기 문제
(The Fractional Knapsack Problem)
물건의 일부분을 잘라서 담을 수 있다.
(보석이 금괴가 아니라 금가루라고 해석하면 된다.)
탐욕적인 접근방법으로 최적 해를 구하는 알고리즘을 만들
수 있다.
[선택전략]무게 당 가치가 가장
품목
무게
값
값어치
item1
5kg
50 만원
10 만원/kg
item2
10kg
60 만원
6 만원/kg
20kg
140 만원
7 만원/kg
높은 물건부터 우선적으로 채운다. item3
item1 + item3 + item2 x 1/2 30kg 220만원
최적이다! 증명생략
Page 34
Appendix
Priority Queue
What is Priority Queue?
응급실에서 환자 치료의 예
큐: 먼저 온 사람을 먼저 치료
스택: 나중에 온 사람을 먼저 치료
우선순위 큐 (Priority Queue)
: 우선순위가 높은 사람 (예: 위급한 사람)을 먼저 치료
Priority Queue
an abstract data type supporting the following three operations:
- add an element to the queue with an associated priority
- Remove and return the element from the queue that has the highest priority
- (optionally) peek at the element with highest priority without removing it
36
Data Structure
Priority Queue
Priority Queue vs. Stack/Queue
스택과 큐
스택과 큐는 시간에 따라 자료구조를 조직화
시간을 포함한 여러 가지 가치를 우선순위로 가지는 자료구조
우선순위 큐
우선 순위 큐는 각 노드에 “우선순위 값” 필드가 필요.
우선순위 큐는 스택이나 큐 보다 일반적인 구조
큐나 스택은 우선순위 큐의 특수한 형태로서 시간에 그 우선순위를
부여한 것임
따라서 우선순위 필드가 불필요
Priority Queue
Stack
37
Queue
Data Structure
Priority Queue
Heap is an excellent structure to implement priority queue
38
Data Structure
Heap
Heap: a binary tree structure with the properties …
Root의 키가 왼쪽자식과 오른쪽 자식의 키보다 크거나 같다.
The subtrees are in turn heaps
지원되는 연산: Insertion, Deletion
주의할 특징
왼쪽 자식과 오른쪽 자식 사이에는 어느 쪽 키가 크던 상관이 없다.
Heap
정렬 관점에서…
BST는 약한 의미로 정렬.
왼쪽 자식 키보다 오른쪽 자식 키가 크다.
Heap도 약한 의미로 정렬.
부모의 키가 자식의 키보다 우선 순위가 높다
왼쪽 자식 키와 오른쪽 자식 키는 무관하다.
Heap
40
Binary search tree
Data Structure