ํผ๋ณด๋์น ์์ด(Fibonacci Numbers)์ด๋?
ํผ๋ณด๋์น ์์ด์ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋๋ค.
F(0) = 0
F(1) = 1
F(n) = F(n-1) + F(n-2) (n ≥ 2)
์์ :
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 ...
1. O(2โฟ) ์๊ฐ ๋ณต์ก๋์ ์ฌ๊ท ๋ฐฉ์ (๋นํจ์จ์ )
JavaScript ์ฝ๋:
function fibonacci(n) {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
์ด ๋ฐฉ์์ ๋๋ฌด ๋๋ ค์ n์ด ์ปค์ง์๋ก ์ฌ์ฉํ ์ ์๋ค.
2. O(n) ์๊ฐ ๋ณต์ก๋์ ๋์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์
JavaScript ์ฝ๋:
function fibonacciDP(n) {
let fib = new Array(n + 1).fill(0);
fib[1] = 1;
for (let i = 2; i <= n; i++) {
fib[i] = fib[i - 1] + fib[i - 2];
}
return fib[n];
}
์ด ๋ฐฉ์์ O(n) ์๊ฐ ๋ณต์ก๋๋ก ํผ๋ณด๋์น ์์ด์ ๊ณ์ฐํ ์ ์๋ค.
3. O(log n) ์๊ฐ ๋ณต์ก๋์ ํ๋ ฌ ๊ฑฐ๋ญ์ ๊ณฑ ๋ฐฉ์
ํผ๋ณด๋์น ์์ด์ ๋ ๋น ๋ฅด๊ฒ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํ๋ ฌ ๊ฑฐ๋ญ์ ๊ณฑ ๋ฐฉ์ ์ ์ฌ์ฉํ ์ ์๋ค.
function fibonacciMatrix(n) {
if (n === 0) return 0;
let F = [[1, 1], [1, 0]];
power(F, n - 1);
return F[0][0];
}
function power(F, n) {
if (n === 0 || n === 1) return;
let M = [[1, 1], [1, 0]];
power(F, Math.floor(n / 2));
multiply(F, F);
if (n % 2 !== 0) multiply(F, M);
}
function multiply(F, M) {
let x = F[0][0] * M[0][0] + F[0][1] * M[1][0];
let y = F[0][0] * M[0][1] + F[0][1] * M[1][1];
let z = F[1][0] * M[0][0] + F[1][1] * M[1][0];
let w = F[1][0] * M[0][1] + F[1][1] * M[1][1];
F[0][0] = x;
F[0][1] = y;
F[1][0] = z;
F[1][1] = w;
}
์ด ๋ฐฉ๋ฒ์ O(log n) ์๊ฐ ๋ณต์ก๋๋ก ๋งค์ฐ ํจ์จ์ ์ด๋ค.
๋ฐ์ํ
๋๊ธ