Q&A 11주차 greedy algorithm
- 실제 삶의 선택은 그리디알고리즘과 비슷하다.
- 최적의 결과를 보장하진 않지만 충분히 괜찮은 선택이다.
- Activity selection
- by person이든 by lecture hall이나 관점이 똑같다.
- finish time을 기준으로 정렬 후에 그담거의 start time와 지금 진행되고있는거의 finish time을 비교하여 후자가 더 작거나 같으면 연속되어 실행할 수 있다!
- efficient greedy algorithm → 시간복잡도의 minimum을 찾아라
- Fractional Knapsack Problem 부분적인 배낭 문제(배낭에 어떤 것을 넣을 건지 선택)
- 단가 = value / weight 이므로 단가가 높은 순서로 정렬한 후에 수용력(capacity = 가져올 수 있는 weight의 총합)에따라 가져온다. 만일 마지막 weight를 가져와야하는데 수용력을 초과한다면 비율만큼을 나눠서 해당 비율만큼만 가져온다.
Q&A 정답
- 1), 2)
- 2activities, finish time으로 sorting 후에 (왜? 1개의 홀에 activities를 넣어야하는데 끝나는 시간 그 다음의 시작 시간을 알아야하니까)
- 4activities, start time으로 sorting 후에 계산( 왜? 여러개의 홀에 activities를 넣어야하는데 시작시간 순으로 정렬하고 그 순서에 맞게 강의실을 늘려가며 넣으면 되고, 만일 시작시간이 기존의 홀에 있던 activity의 끝나는 시간보다 크거나 같으면 강의실을 늘리지 않고 넣을 수 있다.
- 실제 코드로 구성할 때, busy hall / free hall 로 나누어 코드 구현
- 60 (20 + 30 + 10)
- O(n)이므로 sorting 안된다! → value/weight = 단가의 비율을 계산하는 것 O(n) → 단가들의 median 값을 구하여 median값을 기준으로 더 큰 sub set과 더 작은 sub set을 구하고 더 큰 subset만 생각하고 더 큰 sub set의 weight를 다 더해준다. 더해준값을 M이라했을 때, 수용력(W)과 비교한다.
- M>W → 더 큰 sub set에 대해서 한 번 더 해줘야함
- M<W → 큰 sub set에 대해서 다 더해주고, 작은 sub set에서 조금 더 더해줘야한다. (W-M만큼이 수용력이 된다.)
- M=W → 정답
- T(n) = T(n/2) + O(n) ⇒ O(n)
- 60 - 44 = 16
- weight가 증가하는 방향 + value가 감소하는 방향으로 정렬하면 value / weight 인 단가가 감소하는 방향으로 정렬이 될 것이다. → 단가가 높은 순서대로 고르면 되니까 weight가 lightest한 애들(정렬한 것을 생각해보면 무게가 가벼운 것이 가장 가치있는 것이다.)부터 고르면 된다.
- 이 방법이 최적의 방법인지 알아내는 법 → 다른 최적의 방법이 어떤 가정을 한 것을 반박을 하며 가정에 오류가 있음을 찾아내면 기존의 방법(이 방법)이 최적의 방법이다!
-
- → frequency 순서로 정렬해놓고, 가장 작은 2개의 빈도수들끼리 계속 합침 → 합친 것을 새로 정렬하고 기존의 합쳐진 2개의 빈도수들을 지움 → 결과가 트리 모형처럼 나옴 → 왼쪽 노드를 0,. 오른쪽 노드를 1로 생각하여 암호 해독하면 됨
- 왼쪽 노드 1, 오른쪽 노드 0으로 생각하여 해독하면 불가능하다 따라서 해보고 안되면 비트를 0→1 1→0으로 스왑!
- 위와 같이 계산하면 문제에서 A : 00 B : 100 C : 01 D : 11 E : 101
21, 22강 Elementary Graph Algorithms