21-02-22 알고리즘 기초강의
동적 계획과 이항 계수
수식 깨진 것들은 자체 검색으로 보완할 것
동적계획법(Dynamic Programming): 문제를 더 작은 문제로 분할하되 상향식으로 문제를 해결
메모이제이션(Memoization): 가장 작은 입력 사례의 해답을 테이블에 저장하고 필요할 때 꺼내 쓴다
동적계획법으로 문제 풀기
- 문제를 해결할 수 있는 재귀 관계식(점화식)을 구한다
- 가장 작은 입력사례로부터 상향식 방법으로 문제를 해결한다
분할 정복법 vs 동적 계획법
- 문제를 작은 사례로 분할하여 해결한다는 점에서 동일
- Top-Down vs Bottom-Up
이항 계수
- $\binom{n}{k} = \frac{n!}{k!(n-k)!}$, for $0 \le k \le n$
- $\ n!, k!$의 값은 매우 커서 계산이 어렵다
- 이항 계수의 재귀적 정의: 분할 정복
- $\binom{n}{k} = \begin{cases}\binom{n-1}{k-1} + \binom{n-1}{k-1}&0<k<n\{1}&k=0||k=n\end{cases}$
파이썬으로 이항 계수의 재귀적 정의
1 | def bin (n, k): |
자바스크립트
1 | function bin(n, k) { |
$0 \le k \le n$에 의해 $k$는 $n$보다 큰 값일 수 없다
- 이 방식은 중복 호출이 생김 → 반복적 방법이 요구됨
- 이항 계수의 성질: 파스칼의 삼각형
- 이항 계수 구하기
- 재귀 관계식을 찾는다
$$B[i][j] = \begin{cases}B[i-1][j-1]+B[i-1][j]&0<j<i\1&j=0orj=i\end{cases}$$ - 상향식 방법으로 해답을 구한다
- 파스칼의 삼각형이 가진 특성을 이용한다
- 재귀 관계식을 찾는다
파이썬으로 파스칼의 삼각형 구하기
1 | def bin2 (n,k): |
자바스크립트로 파스칼의 삼각형 구하기
1 | function bin2(n) { |
- 이항 계수의 시간 복잡도와 성능 개선
- $k$가 $n/2$보다 클 경우, 나머지 절반 삼각형은 중복값
- 1차원 배열만으로도 구현이 가능
파이썬으로 파스칼의 삼각형 성능개선
1 | def bin3 (n,k): |
자바스크립트로 파스칼의 삼각형 성능개선
1 | function bin3(n,k) { |