일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 송리단길
- 개발자취업특강
- 개발자 채용설명회
- 이미지처리프로젝트
- 팀프로젝트
- 코딩 국비지원
- 개발자취업준비
- 코딩배우기
- 코딩교육
- 코딩 부트캠프
- 프로젝트마무리
- 와탭랩스
- 웹개발프로젝트
- 엘리스
- 인공지능모델학습
- 코딩테스트
- 개발자포트폴리오
- 코딩부트캠프
- 코딩 배우기
- 부트캠프프로젝트발표
- 코딩국비지원
- 웹개발포트폴리오
- 엘리스 AI 트랙
- 엘리스AI트랙데모데이
- 개발자이력서
- 코딩 교육
- 개발자 포트폴리오
- 엘리스AI트랙
- 신입개발자
- 블로그와 친해지기
Archives
- Today
- Total
자몽이 조아
다이나믹 프로그래밍 본문
반응형
연산속도와 메모리공간을 최대한으로 활용할 수 있는 효율적인 알고리즘을 작성해야한다.
보텀업, 탑다운으로 나뉜다.
DP의 예시:
피보나치 수열
점화식:
인접 삼항간 점화식.
function fibonacci(x){
if(x==1 or x==2)
return 1
return fibonacci(x-1) + fibo(x-2)
}
그러나, 이렇게 작성하면 O(2^n)의 지수시간 소요. N=30이면 약 10억 가량의 연산 수행.
이를 DP로 해결해보자.
DP 로 해결할 수 있는 문제의 조건
큰 문제를 작은 문제로 나눌 수 있다
작은 문제에서 구한 정답은 그것을 포함하는 큰 문제에서도 동일하다.
피보나치 수열은 이러한 문제를 만족한다.
메모이제이션(Memoization)기법을 사용하여 해결할 수 있다. 한번 구현한 결과를 메모리공간에 메모해 두고 같은 식을 다시 호출하면 메모한 결과를 그대로 가져오는 기법. Caching이라고도 한다.
let d = [0] * 100
function fibo(x){
if(x==1 or x==2)
return 1
if d[x] != 0
return d[x]
d[x] = fibo(x-1) + fibo(x-1)
return d[x]
}
즉 DP란,
큰 문제를 작게 나누고, 같은 문제라면 한번씩만 풀어 문제를 효율적으로 해결하는 알고리즘 기법이다.
분할정복과 다른점은 문제들이 서로 영향을 미치고 있다는 점
재귀함수를 이용하면 오버헤드가 발생하므로, 반복문을 사용하면 오버헤드를 줄일 수 있다.
DP일 때의 시간복잡도는 O(N)이다.
이처럼 재귀함수를 이용하여 다이나믹 프로그래밍을 하는 방법을 , 큰 문제를 해결하기 위해 작은문제를 호출한다고 하여 탑다운 방식이라한다. 메모이제이션이 이에 해당한다.
반면 단순히 반복문을 이용하여 작성하는 경우, 보텀업방식이라고 한다.
let d = [0] * 100
d[1] = 1
d[2] = 1
n = 99
for (i = 3; i< n+1 ; i++ ){
d[i] = d[i-1] + d[i-2]
}
console.log(d[n])
또한 메모이제이션을 Object자료형을 사용할수도 있다.
예를들어 수열처럼 연속적이지 않은 경우 유용하다.
보텀업, 탑다운으로 나뉜다.
반응형
'알고리즘 코테준비' 카테고리의 다른 글
[프로그래머스] 게임 맵 최단거리 - BFS (0) | 2022.05.19 |
---|---|
최단경로 찾기 (0) | 2022.01.19 |
Comments