the others/Algorithm
Dynamic Programming λμ νλ‘κ·Έλλ°
ciocio
2021. 10. 11. 14:33
π λμ νλ‘κ·Έλλ°μ΄λ ?
λμ νλ‘κ·Έλλ°μ΄λΌκ³ ν΄μ λμ μΌλ‘ ?!? νλ‘κ·Έλλ°μ΄ μ΄λ£¨μ΄μ§λ 건 μλλ€ γ γ γ
ν° λ¬Έμ λ₯Ό μμ λ¬Έμ λ‘ λλμ΄ νΈλ λ²μ λ§νλ€. -> κ·ΈλΌ λΆν μ 볡 μλκ° ?
π Divide and Conquer λΆν μ 볡μ΄λ ?
λΆν μ 볡λ ν° λ¬Έμ λ₯Ό μμ λ¬Έμ λ‘ λλμ΄ νΈλ λ²μ΄λ€.
κ·Έλ¬λ λμ νλ‘κ·Έλλ°κ³Όλ ν° μ°¨μ΄μ μ΄ μλ€.
λΆν μ 볡μ, " μμ λ¬Έμ " μμ λ°λ³΅μ΄ μΌμ΄λμ§ μλλ€.
λμ νλ‘κ·Έλλ°μ, " μμ λ¬Έμ " μμ λ°λ³΅μ΄ μΌμ΄λλ€. -> λΆνμν μΌλ€μ΄ λ°λ³΅μ μΌλ‘ μΌμ΄λλ€.
μ¦, λΆν μ 볡μ μ§μ§ ν° λ¬Έμ λ₯Ό μ¬λ¬ κ°λ‘ μκ² μκ² λλ μ νΈλ λ°©μμ΄λΌλ©΄,
λμ νλ‘κ·Έλλ°μ μ΄μ§νΌ λ°λ³΅λλ μμ λ¬Έμ λ€μ ν κ³³μ λ¬Άμ΄ λκ±°λ(?) κΈ°λ‘(?) νλ μμΌλ‘
λΆνμν λ°λ³΅λ€μ μ€μ΄λ©΄μ ν° λ¬Έμ λ₯Ό ν΄κ²°νλ λ°©μμ λ§νλ€.
π Memoization λ©λͺ¨μ΄μ μ΄μ μ΄λ ?
λμ νλ‘κ·Έλλ°μμ λ°λ³΅λλ μμ λ¬Έμ λ€μ " κΈ°λ‘ " μ ν΅ν΄ λΆνμν λ°λ³΅μ ν΄κ²°νλ λ°©μμ΄λ€.
ν λ² κ³μ°ν μμ λ¬Έμ μ κ°μ μ¬μ¬μ©νκΈ° ν κ³³μ μ μ₯(κΈ°λ‘) ν΄λλλ€.
// memoization μμ
function memoization_fib(n){
let memo = [];
memo[0] = 0;
memo[1] = 1;
if(n <= 1) return memo[n];
for(let i=2; i<n; i++){
memo[n] = memo[n-1] + memo[n-2]
}
return memo[n];
}
// f(2) = f(1) + f(0)
// f(3) = f(2) + f(1) = f(1) + f(0) + f(1)
// f(4) = f(3) + f(2) = f(2) + f(1) + f(1) + f(0) = f(1) + f(0) + f(1) + f(1) + f(0)
// -> μμ λ¬Έμ λ€μ΄ λ°λ³΅λλ€.
// -> κ°μ λ¬Έμ λ ꡬν λλ§λ€ μ λ΅μ΄ κ°λ€.
// λ°λ³΅λλ κ°λ€μ λ°°μ΄μ μ μ₯ν΄λκ³ νμν λλ§λ€ κΊΌλ΄ μ΄λ€. ^__^
π ꡬν λ°©λ² : Bottom-up & Top-down
βΎ Bottom-up
// Bottom-up
// μλλΆν° μ°¨κ·Όμ°¨κ·Ό, κ°μ κ΅¬ν΄ λκ°λ λ°©μμ΄λ€. μλ -> μ
// λλΆλΆμ λ°λ³΅λ¬Έμ΄ Bottom-up λ°©μμ ν΄λΉλλ€.
function fibo_bottom_up(n){
if(n <= 1) return n;
let front = 0;
let next = 1;
for(let i=1; i<n; i++){
let sum = front + next;
front = next;
next = sum;
}
return sum;
}
// fibo_bottom_up(6)μ ꡬνλ€κ³ κ°μ νμ λ,
// i=1, sum=1, front=1, next=1
// i=2, sum=2, front=1, next=2
// i=3, sum=3, front=2, next=3
// i=4, sum=5, front=3, next=5
// i=5, sum=8, front=5, next=8 returnλλ κ°μ 8μ΄λ€.
// μλλΆν° μ°¨λ‘λλ‘ μ°¨κ·Όμ°¨κ·Ό μ¬λΌμ€λ κ³Όμ μ νμΈν μ μλ€.
βΎ Top-down
// Top-down
// ν° λ¬Έμ λ₯Ό ν λ μμ λ¬Έμ λ₯Ό νμ΄μΌ κ°μ΄ λμ¨λ€λ κ±Έ μμμΌ γ
γ
κ·Έμ μμΌ μμ λ¬Έμ λ₯Ό ν΄κ²°νλ λ°©μμ΄λ€.
// μ°¨κ·Όμ°¨κ·Ό λ°©μ μ λ μλ X νμν μμ λ¬Έμ λ€λ§ ν΄κ²°νκ³ λ΅μ λμΆ ! μ -> μλ
// λλΆλΆμ μ¬κ· ν¨μκ° Top-down λ°©μμ ν΄λΉλλ€
// fibo_top_down(6)μ ꡬνκΈ° μν΄ fibo_top_down(5)μ fibo_top_down(4)λ₯Ό ꡬνκΈ° μμν¨
function fibo_top_down_recur(n){
if(n <= 1) return n;
return fibo_top_down_recur(n-1) + fibo_top_down_recur(n-2);
}
// μ°λ¦¬λ Dynamic Programming μ λ°°μ°κ³ μμΌλ,
// μ΄λ―Έ ꡬν κ°μ λ ꡬνλ λλΉλ νμ§ μλλ‘ μ½λλ₯Ό μ§μ !~ :)
function fibo_top_down_dp(n){
let memo = [0, 1];
if(n <= 1) return memo[n];
for(let i=2; i<n; i++){
memo[n] = memo[n-1] + memo[n-2]
}
return memo[n];
}
π λμ νλ‘κ·Έλλ°μ νμ©ν λ¬Έμ νμ΄ μμ
λ°μν