모두야

알고리즘 - DP(Dynamic Programming) 본문

study/Python_study

알고리즘 - DP(Dynamic Programming)

미미밍2 2021. 8. 6. 23:28
반응형

동적 계획법 = DP(Dynamic Programming)

<조건>

1. 큰 문제를 작은 문제로 나눌 수 있다.

2. 작은 문제에서 구한 정답은 그것을 포함하는 큰 문제에서도 동일하다.

 

- 피보나치 수열 [점화식]

 

- 재귀함수 (Recursive Function) : 자기 자신을 다시 호출하는 함수

# 재귀함수 구현
def recursive_function():
	print('재귀 함수를 호출합니다')
    recursive_function()   # 자기 자신을 계속 불러온다.
    
recursive_function()
무한히 출력 되다가, 파이썬에는 호출 횟수 제한이 있으므로 재귀의 최대 깊이를 초과했다는 내용의 오류가 발생한다.
RecursionError: maximum recursion depth exceeded while calling a Python object

 

- 메모제이션(캐싱) : 한번 구한 결과를 메모리 공간에 메모해두고 같은 식을 다시 호출하면 메모한 결과를 그대로 가져온다.

                           : 재귀적으로 수행하다가, 같은 정보가 필요할 때 이미 구한 정답을 리스트에서 가져온다.

# 재귀함수 이용한 피보나치 수열

# 일단 처음 리스트 초기화 상태로 만들어 놓는다 ---- 메모이제이션
 d = [0]*100 
 
 # 피보나치 수열
 def fibo(x):
 	# 종료조건
    if x==1 or x==2:
    	return 1
    # 이미 계산 한적 있다면 0이 아니라 바꼈을것
    if d[x] !=0:
    	return d[x]
    # 아직 계산 안했다면 점화식 이용하여 피보나치 이용(재귀함수)
    d[x] = fibo(x-1) + fibo(x-2)
    return d[x]
    
print(fibo(99))

 

다이나믹 프로그래밍 퀵 정렬
문제들이 서로 영향을 미치고 있다 정렬할 리스트를 분할하면 전체적으로 정렬한다.
 한번 해결한 문제는 이미 답이 정해져있으니, 다시 해결하지 않고 전에 구한 값을 반환한다. 한번 기준 원소(pivot)이 자리를 변경해서 자리 잡는다면, 그 기준 원소의 위치는 더 이상 바뀌지 않고, 그 피벗값을 다시 처리하는 부분 문제는 존재하지 않는다.

 

탑다운(Top-Down) 방식 : 큰 문제를 해결하기 위해 작은 문제를 호출한다. ( 재귀함수를 이용한  DP)

보텀업(Bottom-Up) 방식 : 반복문을 이용하여 작은 문제부터 차근차근 답을 도출한다.

 

# 보텀업(Bottom-Up) 이용한 피보나치 수열
d = [0] *100

# 첫번째, 두번째 피보나치수 1로 입력
d[1] = 1
d[2] = 2
n = 99

# 피보나치 수열
for i in range(3,n+1): # 100까지
	d[i] = d[i-1]+d[i-2]
    
print(d[n])

1) 완전 탐색 알고리즘으로 접근했을 때 시간이 매우 오래 걸린다면 다이나믹 프로그래밍 인지, 풀어야하는 문제들의 중복 여부를 확인해본다.

 

2) 재귀함수 - 작은문제에서 구한 답이 큰 문제로 그대로 사용할 수 있다면, 메모이제이션도 적용해본다.

 

3) 탑다운 보다는 보텀업 - 너무 크면 RecursionError 발생한다. 그렇다면 sys 라이브러리의 setrecursionlimit( ) 함수를 호출하여 재귀 제한을 완화한다.

 

 

반응형

'study > Python_study' 카테고리의 다른 글

[github] Window 에 깃허브 설치하기  (0) 2021.08.14
파이썬 [Code up] - 출력/입출력/값변환  (0) 2021.08.06
python xlsx to csv  (0) 2021.08.03
DFS/BFS(그래프탐색)  (0) 2021.05.12
순차탐색/이진탐색  (0) 2021.05.06