Fibonacci Number
2020-1νκΈ°, λνμμ βμκ³ λ¦¬μ¦β μμ μ λ£κ³ 곡λΆν λ°λ₯Ό μ 리ν κΈμ λλ€. μ§μ μ μΈμ λ νμμ λλ€ :)
<Fibonacci Number>λ μ¬κ· ν¨μμ λν κ·Όλ³ΈκΈμ μ£Όμ μ΄λ€. μΌλ¨ μ¬κ·μ μμ²΄κ° μ§κ΄μ μ΄κ³ , λ μ΄κ²μ μ΅μ ν νκΈ° μν΄ μ λ§ λ§μ ν ν¬λμ΄ μ μλκ³ λ μ°κ΅¬λμλ€.
\[f(n) = f(n-1) + f(n-2)\]Brute Force
κ°μ₯ λ¨Όμ μκ°ν΄λ³Ό μ μλ λ°©λ²μ <Fibonacci Number>μ μ μμ λ§κ² ν¨μλ₯Ό μ§λ κ²μ΄λ€. κ·Έλ₯ μλμ κ°μ΄ μ§λ©΄ λλ€.
int fibo(n) {
if (n <= 1) return n;
return fibo(n-1) + fibo(n-2);
}
κ·Έλ¬λ μμ μκ³ λ¦¬μ¦μ μΌμ λμ μκ° λ³΅μ‘λλ exponential νλ€. π€¦ββοΈ
fibo()
μ μν΄ μμ±λλ recursion treeλ₯Ό μκ°ν΄λ³΄μ. μ΄λ, treeμ leafλ νμ 1μ 리ν΄ν΄μ£Όκ³ μ΄μ λ°λΌ fibo(n)
μ κ°μ λ¨μν recursion treeμ leaves μλ‘ μ λν μ μλ€.
μ΄λ, leaf λ¨μμλ $O(1)$ λ§νΌμ μκ°μ΄ 걸리기 λλ¬Έμ κ²°κ΅, $T(n) = \text{fibo}(n) \cdot O(1)$μ 볡μ‘λλ₯Ό κ°μ§κ² λλ€.
λ°λΌμ, μ¬κ·λ‘ ꡬνλ <Fibonacci number>λ κ²°κ΅ <Fibonacci number>μ κ° μ체μ μκ° λ³΅μ‘λλ₯Ό κ°μ§κ² λλ€. λ°λΌμ, μ΄κ²μ λλ΅
\[\Theta \left( \left(\frac{1+\sqrt{5}}{2} \right)^n \right) = \Theta(1.6^n)\]μ 볡μ‘λλ₯Ό κ°μ§λ€. // 보ν΅μ $O(2^n)$λΌκ³ λΆλ₯΄λ κ² κ°λ€.
μ΄λ κ² μκ³ λ¦¬μ¦μ΄ exponentialν 볡μ‘λλ₯Ό κ°κ² λλ©΄, μ μ΄μ μ»΄ν¨ν°μ κ³μ°μΌλ‘ κ°λΉν μκ° μλ€. λ¨μν $\text{Fibo}(100)$μ ꡬνλ λ°λ§ ν΄λ 12ζ₯μ΄ νμνλ€. κ·Έλμ μ§κΈμ λ°©μμ correct νμ§λ§ μ€μ μμ μΈ μλ μλ€ π€¦ββοΈ
DP
DPλ μ΄ μν©μ μ λ§ μμνκ² ν΄κ²°ν΄μ€λ€. DPμμλ <memoization>μ ν΅ν΄ κ³μ°ν κ°μ λ°°μ΄μ κΈ°λ‘ν΄λλ€. λ°λΌμ, λ€μ ν΄λΉ κ°μ λν μΏΌλ¦¬κ° λ€μ΄μμ λ, κ³μ°μ λ νμ§ μκ³ λ°°μ΄μ μ μ₯λ κ°μ λ°λ‘ μ¬μ©νκΈ°λ§ νλ©΄ λλ€!! π
int memo[MAX];
int fibo(n) {
if (n <= 1) return n;
if (memo[n] != -1) return memo[n];
memo[n] = fibo(n-1) + fino(n-2);
return memo[n];
}
μ½λλ₯Ό μ΄λ κ² μ§€ κ²½μ°, μ°λ¦¬λ $1$λΆν° $n$κΉμ§ μΆκ°μ μΈ μ¬κ·νΈμΆ μμ΄ λ± νλ²μ© μννκ² λλ κ²μ΄λ―λ‘ $O(n)$μ μκ°μ΄λ©΄ μΆ©λΆνλ€!! π²
π₯ μ΄λ, μ£Όμν μ μ μ무리 DPλ₯Ό μ°λλΌλ μ¬κ·λ‘ ꡬννλ€λ©΄, μ¬κ· ν¨μ νΈμΆμ΄ 1,000,000(=λ°±λ§) μ λ λλ©΄ νλ‘κ·Έλ¨μ΄ μ μμ μΌλ‘ λμνμ§ μλλ€! π² κ·Έλμ μ λ§νλ©΄, DPλ‘ νλλΌλ μ¬κ·λ‘ ꡬννκΈ° 보λ€λ for
λ¬ΈμΌλ‘ μ μ ν λ³νν΄μ ꡬννλ κ±Έ κ°.λ ₯. μΆμ²νλ€.
Matrix-based
Property. Pisano Period
νΌλ³΄λμΉ μλ₯Ό μ μ $K$λ‘ λλ λλ¨Έμ§λ νμ μ£ΌκΈ°λ₯Ό κ°μ§κ² λλ€. μ΄ μ£ΌκΈ°λ₯Ό <Pisano Period>λΌκ³ νλ€.
Matrix-based λ°©λ²μ μ’λ ν° λ²μμ νΌλ³΄λμΉμ μλ₯Ό λ€λ£° λ λ λΉ λ₯΄κ² κ³μ°ν μ μλ ν ν¬λμ΄λ€! π²
νΌλ³΄λμΉ μλ₯Ό νλ ¬λ‘ νννλ©΄ μλμ κ°λ€.
\[\begin{pmatrix} F_{n+2} \\ F_{n+1} \end{pmatrix} = \begin{pmatrix} 1 & 1 \\ 1 & 0 \end{pmatrix} \begin{pmatrix} F_{n+1} \\ F_n \end{pmatrix}\]μμ μμ μ’λ λ€λ¬κ³ μ 리νλ©΄, μλμ κ°μ κ²°κ³Όλ₯Ό μ»μ μ μλ€. κ·Έλ₯ λ¨μνκ² μ°λ³μ νΌλ³΄λμΉμ λν λΆλΆμ μμ λμ νλ©΄ μ»λ μμ΄λ€.
\[\begin{pmatrix} F_{n+1} & F_n \\ F_n & F_{n-1} \end{pmatrix} = \begin{pmatrix} 1 & 1 \\ 1 & 0 \end{pmatrix}^n\]μ¦, μ°λ¦¬λ νΌλ³΄λμΉ μλ₯Ό μ»κ³ μΆλ€λ©΄, \(\begin{pmatrix} 1 & 1 \\ 1 & 0 \end{pmatrix}\)λ₯Ό $n$λ² κ³±ν΄μ£Όλ©΄ λλ€λ κ²μ΄λ€. μ°Έκ³ λ‘ μ΄λ° νλ ¬μ μ κ³±μ λΆν μ 볡μ μ΄μ©ν΄ $O(\log n)$λ§μ κ³μ°ν μ μλ€!!
κ²°κ΅, matrix-based λ°©μμ μ°λ©΄, νΌλ³΄λμΉ μλ₯Ό $O(\log n)$μ μκ° λ³΅μ‘λλ‘ κ΅¬ν μ μλ κ²μ΄λ€!!! π
β¨ μ΄ Matrix-based λ°©μμ νΌλ³΄λμΉ μ λΏλ§ μλλΌ λ€λ₯Έ μ¬κ· ν¨μ μμμλ λΉμ·ν λ Όλ¦¬λ‘ μ μ©ν μ μλ€!! π
π₯ μ°Έκ³ λ‘ νΌλ³΄λμΉ μμ κ²½μ°, $n=100$λ§ λμ΄λ int
μ λ²μλ₯Ό λ²μ΄λκ² λλ€. κ·Έλ¬λ λλνκ² μκ°ν΄ 미리 long long
μΌλ‘ ꡬνν΄λμ!
- λ°±μ€ 10870λ²: νΌλ³΄λμΉ μ 5
- νΌλ³΄λμΉ μλ₯Ό ꡬνλ μ¬λ¬κ°μ§ λ°©λ² π₯ νΌλ³΄λμΉμ κ΄λ ¨λ κ±°μ λͺ¨λ λ΄μ©μ΄ λ€μ΄μλ€ π₯
- λ°±μ€ 11726λ²: 2xn νμΌλ§ // νΌλ³΄λμΉμ ν¨κ» μ¬κ·-DPμ λν λ¬Έμ ! β¨