23 λμ νλ‘κ·Έλλ°
23.1 λμ νλ‘κ·Έλλ°
λμ νλ‘κ·Έλλ°μ΄λ 볡μ‘ν λ¬Έμ λ₯Ό κ°λ¨ν νμ λ¬Έμ μ λͺ¨μμΌλ‘ λΆλ¦¬ν΄μ κ° νμ λ¬Έμ λ€μ νμ΄μ κ·Έ λ΅μ μ μ₯νκ³ νμ©νλ λ°©μμΌλ‘ λ¬Έμ λ₯Ό ν΄κ²°νλ λ¬Έμ ν΄κ²° λ°©μμ΄λ€. μ¦, λ¬Έμ λ₯Ό ν΄κ²°νλλ° μ¬μ©ν μ μλ μ κ·Ό λ°©λ² μ€ νλμ΄λ€. λλΆλΆμ λ¬Έμ λ₯Ό λμ νλ‘κ·Έλλ°μΌλ‘ ν΄κ²° ν μλ μμ§λ§, λμ νλ‘κ·Έλλ°μΌλ‘ ν΄κ²°ν μ μλ λ¬Έμ λ€μ λν΄ λμ νλ‘κ·Έλλ°μΌλ‘ λ¬Έμ λ₯Ό ν΄κ²°νλ κ²½μ° μ±λ₯μ μμ΄μ μμ£Ό ν° μ°¨μ΄λ₯Ό κ°μ Έμ¨λ€. λ€μ λ§ν΄ λλΆλΆμ λ¬Έμ μ μ μ©ν μ μλ κ²μ μλμ§λ§ μ¬μ©ν μ μλ κ²½μ°μλ μ½λμ μλλ₯Ό μ λ§ λ§μ΄ μ¬λ¦΄ μ μλ€.
23.2 λμ νλ‘κ·Έλλ° νμ© κ°λ₯ μν©
λμ νλ‘κ·Έλλ°μ μ¬μ©ν μ μλμ§λ₯Ό νμΈνκΈ° μν΄μλ λ κ°μ§ 쑰건μ νμΈν΄μΌ νλ€.
1) λ°λ³΅λλ νμ λ¬Έμ κ° μ‘΄μ¬νλκ°?
2) μ΅μ λΆλΆ κ΅¬μ‘°κ° μ‘΄μ¬νλκ°?
λ°λ³΅λλ νμ λ¬Έμ λ ν΄κ²°μ΄ νμν λ¬Έμ μ μ΄λ€ λ°©μμΌλ‘λ μ€μ²©λλ νμ λ¬Έμ λ€μ΄ μμ΄μΌ νλ€λ κ²μ΄λ€. μ΄ λ§μ ν λ¬Έμ λ₯Ό λ μμ λ¬Έμ λ€λ‘ λλ μ μκ³ , κ·Έ μ‘°κ°λ€ μ€ μΌλΆκ° μ¬νμ© κ°λ₯νλ€λ λ§μ΄λ€. κ°κ°μ μ‘°κ°μ΄ λ€λ₯Έ λͺ¨μ΅μ΄λ©΄ μλκ³ μ¬λ¬ λ² μ¬μ¬μ©ν μ μμ΄μΌ νλ€. λνμ μΈ μλ‘ νΌλ³΄λμΉ μμ΄μ λ€ μ μλ€.
μ΅μ λΆλΆ ꡬ쑰λ νμ λ¬Έμ μ μ΅μ ν΄λ΅μ ν΅ν΄μ λ ν° λ²μ£Όμ λ¬Έμ μ μ΅μ ν΄λ΅μ ꡬμ±ν μ μλ κ²½μ°λ₯Ό λ§νλ€. μλ₯Ό λ€λ©΄ μμΈμμ λΆμ°μ κ°λ μ΅λ¨ κ²½λ‘λ₯Ό ꡬν΄μΌ νλ€κ³ ν΄λ³΄μ. μ΄ λ¬Έμ λ (μμΈμμ μ²μμΌλ‘ κ°λ μ΅λ¨ 거리) + (μ²μμμ λΆμ°μΌλ‘ κ°λ μ΅λ¨ 거리)λ‘ νμ λ¬Έμ λ₯Ό λλ μ μκ³ κ°κ°μ νμ λ¬Έμ μ μ΅λ¨ 거리λ€μ ν©μ΄ (μμΈμμ λΆμ°μΌλ‘ κ°λ μ΅λ¨ 거리)κ° λλ κ²μ λ§νλ€.
23.3 νΌλ³΄λμΉ μμ΄
μΌλ° μ¬κ· λ°©μμΌλ‘ νΌλ³΄λμΉ μμ΄
βνΌλ³΄λμΉ κ³΅μ
1) fib(n) = fib(n-1) + fib(n-2)
2) fib(2) = 1
3) fib(1) = 1
μλ₯Όλ€μ΄ fib(20)μ 20λ²μ§Έ μ«μμ κ°μ λ§νλ κ²μ΄λ€.
fib(6)μ μ«μ 8μ μλ―Ένλ€.(1 + 1 + 2 + 3 + 5 + 8)
// μΌλ° μ¬κ· λ°©μμ νΌλ³΄λμΉ μμ΄
function fib(n){
if(n <= 2) return 1;
return fib(n-1) + fib(n-2);
}
μμ ν¨μμ²λΌ μΌλ° μ¬κ· λ°©μμΌλ‘ νΌλ³΄λμΉ μμ΄μ μμ±ν μ μμ§λ§, O(2^N)μ μκ° λ³΅μ‘λλ₯Ό κ°μ§κΈ° λλ¬Έμ λ§€μ° λΉν¨μ¨μ μ΄λ€. μ‘°κΈλ§ μ λ¬νλ κ°μ ν΄μλ‘ μ²λ¦¬ μκ°μ΄ λ§€μ° μ€λκ±Έλ¦°λ€. μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ λ°©λ²μ΄ λ°λ‘ λμ νλ‘κ·Έλλ°μ΄λ€. νΌλ³΄λμΉ μμ΄μ κ²½μ° λ°λ³΅λλ νμ λ¬Έμ κ° μ‘΄μ¬νκ³ μ΅μ λΆλΆ ꡬ쑰λ₯Ό κ°κΈ° λλ¬Έμ λμ νλ‘κ·Έλλ°μΌλ‘ ν΄κ²°ν μ μλ€.
(ex fib(5) = fib(4) + fib(3) = fib(3) + fib(2) + fib(2) + fib(1))
23.4 Memoμ κ°μ μ μ₯νλ λ°©λ²(Memoization)
μμ μΌλ° μ¬κ· λ°©μμ νΌλ³΄λμΉ ν¨μμ λ¬Έμ μ μ ν΄κ²°νλ λ°©λ²μΌλ‘λ νμ λ¬Έμ λ₯Ό ν΄κ²°νκ³ λμ¨ κ°λ€μ κΈ°μ΅ν΄ λμλ€κ° λ€μ νμ©νλ κ²μ΄λ€. μλ₯Ό λ€λ©΄ fib(5)λ₯Ό ꡬν λλ fib(3)μ κ³μ°μ΄ λ λ² λ°λ³΅νκ² λλλ° μ²μ fib(3)μ κ³μ°νμλ μ΄λ₯Ό κΈ°μ΅νκ³ λ€μ fib(3)μ κ³μ°ν΄μΌν λ 미리 μ μ₯ν΄ λμ fib(3)μ κ°μ νμ©ν΄μ λΉ λ₯΄κ² κ³μ°νλ κ²μ΄λ€. ν΅μ¬μ λ³΄ν΅ λ°°μ΄μ΄λ κ°μ²΄λ‘ λ°μ΄ν°λ₯Ό μ μ₯ν ꡬ쑰λ₯Ό λ§λ λ€μ μ μ₯ν΄ λμ κ°λ€μ νμ©ν΄μΌ νλ€.
function fib(n, memo=[]){
if(memo[n] !== undefined) return memo[n]
if(n <= 2) return 1;
var res = fib(n-1, memo) + fib(n-2, memo);
memo[n] = res;
return res;
}
23.5 Memoizationμ νμ©ν΄μ νΌλ³΄λμΉλ₯Ό ꡬννμ κ²½μ°μ λΉ μ€ μκ° λ³΅μ‘λ
1) μΌλ° μ¬κ·ν νΌλ³΄λμΉ : O(2^N)
2) λ©λͺ¨μ΄μ μ΄μ μ ν΅ν νΌλ³΄λμΉ : O(N)
23.6 Tabulation
νλ·Έλ μ΄μ μ 루νμ κ°μ΄ μνμ ν΅ν΄ μμ νλ€. λ©λͺ¨μ΄μ μ΄μ κ³Όλ λ°λλ‘ κ°μ₯ μμ νμ λ¬Έμ λ₯Ό νΌ λ€μμ κ·Έ κ²°κ³Όλ₯Ό μ μ₯νλ€. μ¦, κ°μ₯ λ°λ₯μ μμΉν fib(1)λΆν° κ³μ°μ νλ©΄μ μ μ₯νκ³ μ΄λ₯Ό νμ©νλ©° μ¬λΌκ°λ λ°©μμ΄λ€.
function fib(n){
if(n <= 2) return 1;
var fibNums = [0,1,1];
for(var i = 3; i <= n; i++){
fibNums[i] = fibNums[i-1] + fibNums[i-2];
}
return fibNums[n];
}