최소화
하는 문제
- 10개의 마을이 신도시에 만들어질 계획이다.
- 아래의 2가지 조건이 만족되도록 학교 위치를 선정해야 한다.
- 학교는 마을에 위치해야 한다.
- 등교 거리는 걸어서 15분 이내이어야 한다.
- 어느 마을에 학교를 신설해야 학교의 수가 최소가 되는가?
최적해
∪ = {1, 2, 3, 4, 8}∪{5, 6, 7, 9, 10}
= {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} = U
따라서, 2와 6 위치에 배치하는 것이 최적
근사해
찾기! => How? 그리디
방법으로!
- U의 원소를 가장 많이 커버하는 집합인 ={2, 3, 4, 5, 7, 8}을 F에서 선택
- U = U - = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} - {2, 3, 4, 5, 7, 8} = {1, 6, 9, 10}
- U의 원소를 가장 많이 커버하는 집합인 ={5, 6, 7, 9, 10}을 F에서 선택
- U = U - = {1, 6, 9, 10} - {5, 6, 7, 9, 10} = {1}
- U의 원소를 가장 많이 커버하는 집합인 ={1, 2, 3, 8}을 F에서 선택( 대신에 , , 중에서 어느 하나를 선택해도 무방)
- U = U - = {1} - {1, 2, 3, 8}=∅
따라서, 1, 4, 6 위치에 배치하는 것이 근사적으로 최적
입력
: U = {1, 2, 3, 4, ..., n}, F = {}출력
: 집합 커버 CSetCover(U, F){
C = NULL; //C 초기화
while(!U){ //U가 공집합이 될 때까지
U의 원소를 가장 많이 커버하는 집합 S_i 선택;
// 각 집합 S_i와 U의 원소를 비교
U = U - S_i;
F = F - S_i;
C = C + S_i;
}
return C;
}
while-Loop
: n
번 * O(1)
(U 비었는지 검사) =
비교
: n
( 최대 개수) * O(n)
(하나의 비교하는 데 걸리는 시간) = 원소 제거
:
빠른 시작시간 작업 우선 (Earliest start time first) 배정
- 작업 [시작시간, 종료시간]
t1=[7,8], t2=[3,7], t3=[1,5], t4=[5,9], t5=[0,2], t6=[6,8], t7=[1,6]
시작시간의 오름차순으로 정렬(빠른 시작시간 작업부터)
기계 1에 배정 가능하므로 작업 [0, 2] 배정
기계 2에 배정 불가능하므로 기계 2에 작업 [1,6] 배정
기계 1, 2에 배정 불가능하므로 기계 3에 작업 [1,5] 배정
기계 1에 배정 가능하므로 기계 1에 작업 [3,7] 배정
기계 1, 2에 배정 불가능, 기계 3에 배정 가능하므로 기계 3에 작업 [5,9] 배정
기계 1, 3에 배정 불가능, 기계 2에 배정 가능하므로 기계 2에 작업 [6,8] 배정
기계 2, 3에 배정 불가능, 기계 1에 배정 가능하므로 기계 1에 작업 [7,8] 배정
입력
: n개의 작업 리스트 L출력
: 각 기계에 배정된 작업 순서 JobScheduling(L)
시작시간 오름차순으로 L 정렬;
while (!L){//L이 빌 때까지
L에서 가장 이른 시작시간 작업 t_i 가져오기;
if (t_i 실행가능 기계 있으면)
t_i 실행가능 기계에 배정;
else
새로운 기계에 t_i 배정;
L = L - t_i;
}
return 각 기계에 배정된 작업 순서;
작업 시작시간 정렬
: => 최소 힙정렬while Loop
: 번사용가능 기계 찾기
: => m은 기계 수
8 x (파일의 문자 수)
허프만 압축
빈번
히 나타나는 문자에는 짧은
이진 코드를 할당하고, 드물
게 나타나는 문자에는 긴
이진 코드를 할당접두부 특성
(prefix property) 존재문자와 각 문자의 빈도수
A
: 450
T
: 90
G
: 120
C
: 270
우선순위 큐 Q 생성
Q에서 ‘T’와 ‘G’를 제거한 후, 둘의 가중치를 더하여 새 노드를 만들고 새 노드를 부모 노드로 한다. 새 부모 노드를 다시 Q에 삽입한다.
Q에서 ‘T’와 ‘G’의 부모 노드와 ‘C’를 제거한 후, 둘의 가중치를 더하여 새 노드를 만들고 새 노드를 부모 노드로 한다. 새 부모 노드를 다시 Q에 삽입한다.
Q에서 ‘C’의 부모 노드와 ‘A’를 제거한 후, 둘의 가중치를 더하여 새 노드를 만들고 새 노드를 부모 노드로 한다. 새 부모 노드를 Q에 삽입한다.
Q에 있는 노드 수가 2개 미만이므로(1개), 루트로부터 왼쪽 자식 노드로 내려가면 ‘0’을, 오른쪽 자식 노드로 내려가면 ‘1’을 부여한다. 문자의 이진 코드를 구한다.
이진코드
A
: 0
T
: 100
G
: 101
C
: 11
압축률
압축된 파일의 bit 수
(450x1)+(90x3)+(120x3)+(270x2) = 1,620 bit
아스키 코드로 된 파일 크기
(450+90+120+270)x8 = 7,440 bit
파일 압축률
(1,620/7,440)x100 = 21.8%이며, 원래의 약 1/5 크기로 압축됨
가중치 그래프 G = (V, E)
정점의 수 |V| = n
간선의 수 |E| = e
출발 정점 s
s부터 v까지의 최단거리 저장 배열 D
입력
: n개의 문자에 대한 각각의 빈도수출력
: 허프만 트리HuffmanCoding()
각 문자 당 노드를 만들고, 그 문자의 빈도수를 노드에 저장;
n개의 노드의 빈도수에 대해 우선순위 큐 Q 생성;
while ( len(Q) ≥ 2 ) {//Q에 있는 노드 수가 2개 미만 될 때까지
빈도수 가장 작은 2개 노드 Q에서 제거;
새 노드 N 생성;
A와 B를 N의 자식 노드로;
N 빈도수 = A 빈도수 + B 빈도수;
노드 N을 Q에 삽입;
}
return Q //허프만 트리의 루트
n개 노드 생성, 각 빈도수 노드에 저장
: 우선순위 큐 생성
: => 힙 자료구조 사용 시while-Loop
: 번루트 리턴
: