-
Notifications
You must be signed in to change notification settings - Fork 21.2k
Expand file tree
/
Copy pathFibonacci.java
More file actions
131 lines (122 loc) · 4.84 KB
/
Copy pathFibonacci.java
File metadata and controls
131 lines (122 loc) · 4.84 KB
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package com.thealgorithms.dynamicprogramming;
import java.util.HashMap;
import java.util.Map;
/**
* Collection of Dynamic Programming techniques to solve for the n-th Fibonacci number.
* <p>
* This file showcases Top-Down Memoization ({@code fibMemo}), Bottom-Up Tabulation ({@code fibBotUp}),
* and Space-Optimized Iteration ({@code fibOptimized}).
* <p>
* For alternative structural paradigms, mathematical formulas, or verification steps, see:
* <ul>
* <li>{@link com.thealgorithms.maths.FibonacciLoop} - Standard Iterative (Loop) approach</li>
* <li>{@link com.thealgorithms.recursion.FibonacciSeries} - Naive Recursive approach</li>
* <li>{@link com.thealgorithms.maths.FibonacciJavaStreams} - Functional approach using Java Streams</li>
* <li>{@link com.thealgorithms.maths.FibonacciNumberGoldenRation} - Closed-form expression using Binet's formula</li>
* <li>{@link com.thealgorithms.maths.FibonacciNumberCheck} - Utility to check if a given number is a Fibonacci number</li>
* <li>{@link com.thealgorithms.matrix.matrixexponentiation.Fibonacci} - O(log n) Matrix Exponentiation approach</li>
* </ul>
* * @author Varun Upadhyay (https://github.com/varunu28)
*/
public final class Fibonacci {
private Fibonacci() {
}
static final Map<Integer, Integer> CACHE = new HashMap<>();
/**
* This method finds the nth fibonacci number using memoization technique
*
* @param n The input n for which we have to determine the fibonacci number
* Outputs the nth fibonacci number
* @throws IllegalArgumentException if n is negative
*/
public static int fibMemo(int n) {
if (n < 0) {
throw new IllegalArgumentException("Input n must be non-negative");
}
if (CACHE.containsKey(n)) {
return CACHE.get(n);
}
int f;
if (n <= 1) {
f = n;
} else {
f = fibMemo(n - 1) + fibMemo(n - 2);
CACHE.put(n, f);
}
return f;
}
/**
* This method finds the nth fibonacci number using bottom up
*
* @param n The input n for which we have to determine the fibonacci number
* Outputs the nth fibonacci number
* @throws IllegalArgumentException if n is negative
*/
public static int fibBotUp(int n) {
if (n < 0) {
throw new IllegalArgumentException("Input n must be non-negative");
}
Map<Integer, Integer> fib = new HashMap<>();
for (int i = 0; i <= n; i++) {
int f;
if (i <= 1) {
f = i;
} else {
f = fib.get(i - 1) + fib.get(i - 2);
}
fib.put(i, f);
}
return fib.get(n);
}
/**
* This method finds the nth fibonacci number using bottom up
*
* @param n The input n for which we have to determine the fibonacci number
* Outputs the nth fibonacci number
* <p>
* This is optimized version of Fibonacci Program. Without using Hashmap and
* recursion. It saves both memory and time. Space Complexity will be O(1)
* Time Complexity will be O(n)
* <p>
* Whereas , the above functions will take O(n) Space.
* @throws IllegalArgumentException if n is negative
* @author Shoaib Rayeen (https://github.com/shoaibrayeen)
*/
public static int fibOptimized(int n) {
if (n < 0) {
throw new IllegalArgumentException("Input n must be non-negative");
}
if (n == 0) {
return 0;
}
int prev = 0;
int res = 1;
int next;
for (int i = 2; i <= n; i++) {
next = prev + res;
prev = res;
res = next;
}
return res;
}
/**
* We have only defined the nth Fibonacci number in terms of the two before it. Now, we will
* look at Binet's formula to calculate the nth Fibonacci number in constant time. The Fibonacci
* terms maintain a ratio called golden ratio denoted by Φ, the Greek character pronounced
* ‘phi'. First, let's look at how the golden ratio is calculated: Φ = ( 1 + √5 )/2
* = 1.6180339887... Now, let's look at Binet's formula: Sn = Φⁿ–(– Φ⁻ⁿ)/√5 We first calculate
* the squareRootof5 and phi and store them in variables. Later, we apply Binet's formula to get
* the required term. Time Complexity will be O(1)
* @param n The input n for which we have to determine the fibonacci number
* Outputs the nth fibonacci number
* @throws IllegalArgumentException if n is negative
*/
public static int fibBinet(int n) {
if (n < 0) {
throw new IllegalArgumentException("Input n must be non-negative");
}
double squareRootOf5 = Math.sqrt(5);
double phi = (1 + squareRootOf5) / 2;
return (int) ((Math.pow(phi, n) - Math.pow(-phi, -n)) / squareRootOf5);
}
}