CS 101

[algorithm] dynamic programming [python]

yungommi 2023. 2. 2. 12:23
반응형

복잡한 문제를 간단한 여러 개의 문제로 나누어 푸는 방법이다. 1 부분 문제 반복(Overlapping subproblems)과 최적 부분 구조(Optimal substructure)를 가지고 있는 알고리즘을 일반적인 방법에 비해 더욱 적은 시간 내에 풀 때 사용한다.\
여기서 부분 문제 반복과 최적 부분 구조를 가지고 있다에서
부분 문제의 해는 전체 문제의 해를 구할 때 필요해야한다.

Tabulation

하향식 Bottom-Up 방식이라고도 한다.
최초 값부터 차례대로 계산해 나가는 방식이다

def fibonacci_dp(num):
    f = [0, 1]
    for i in range(2, num+1):
        f.append(f[i-1] + f[i-2])
    return f

Memoization

<동일 계산 반복시>
이전 계산값을 메모리에 저장하여(메모리 공간을 약간 더 사용한다)(캐싱이라고도 한다.)
매번 다시 실행하지 않도록해서 / 실행 속도를 빠르게 하는 기술이다.

상향식 Top Down 방식이라고도 한다.

def fibonacci_memoi(num):
    global memo
    if num >= 2 and len(memo) <= num:
        memo.append(fibonacci_memoi(num-1) + fibonacci_memoi(num-2))
    return memo[num]
memo = [0, 1]

or

dp = [0]*100 # 소문제 결과를 저장할 리스트
dp[0] = 1 
dp[1] = 1

def fib(n):
    
    # 만약 계산한 적이 없다면 재귀로 계산 
    if dp[n] == 0:
        dp[n] = fib(n-1) + fib(n-2)
    
    # 있다면 그대로 반환 
    return dp[n]

fib(10)

examples

스트링편집거리 - tabulation bottom-top

def edit_distance(s:str, t: str):
    m = len(s)+1
    n = len(t)+1
    D = [[0]*m for _ in range(n)]
    D[0][0] = 0
    
    for i in range(1,m):
        D[0][i] = D[0][i-1] + 1
    
    for j in range(1,n):
        D[j][0] = D[j-1][0] + 1
    
    for i in range(1,n):
        for j in range(1,m):
            cost = 0

            if s[j-1] != t[i-1]:
                cost = 1
            
            D[i][j] = min(D[i][j-1] + 1,D[i-1][j] + 1, D[i-1][j-1] + cost)
    
    return D[n-1][m-1]
                
edit_distance('GUMBO', 'GAMBOL')
 
반응형