diff --git a/code_to_optimize/java/src/main/java/com/example/Algorithms.java b/code_to_optimize/java/src/main/java/com/example/Algorithms.java index bc976d3c3..9051e1f63 100644 --- a/code_to_optimize/java/src/main/java/com/example/Algorithms.java +++ b/code_to_optimize/java/src/main/java/com/example/Algorithms.java @@ -9,7 +9,7 @@ public class Algorithms { /** - * Calculate Fibonacci number using recursive approach. + * Calculate Fibonacci number using fast doubling algorithm (O(log n)). * * @param n The position in Fibonacci sequence (0-indexed) * @return The nth Fibonacci number @@ -18,7 +18,28 @@ public long fibonacci(int n) { if (n <= 1) { return n; } - return fibonacci(n - 1) + fibonacci(n - 2); + // Fast doubling O(log n) computation to reduce time and memory usage. + long a = 0L; // F(0) + long b = 1L; // F(1) + + int highestBit = 31 - Integer.numberOfLeadingZeros(n); + for (int i = highestBit; i >= 0; i--) { + // Apply doubling formulas: + // F(2k) = F(k) * (2*F(k+1) - F(k)) + // F(2k+1) = F(k+1)^2 + F(k)^2 + long twoBMinusA = (b << 1) - a; // 2*b - a + long d = a * twoBMinusA; // F(2k) + long e = a * a + b * b; // F(2k+1) + + if (((n >> i) & 1) == 0) { + a = d; + b = e; + } else { + a = e; + b = d + e; + } + } + return a; } /**