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..dc6ba2531 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 mask = Integer.highestOneBit(n); + for (; mask != 0; mask >>>= 1) { + // Apply doubling formulas: + // F(2k) = F(k) * (2*F(k+1) - F(k)) + // F(2k+1) = F(k+1)^2 + F(k)^2 + long twoB = b + b; + long d = a * (twoB - a); // F(2k) + long e = a * a + b * b; // F(2k+1) + + if ((n & mask) == 0) { + a = d; + b = e; + } else { + a = e; + b = d + e; + } + } + return a; } /**