Enter Fibonacci Fibonacci is well known for it's famous sequence numbers: 0 1 1 2 3 5 8 13... In fact, Fibonacci numbers grow as fast as the power of 2, it's about Fn = 2^0.694n. Hence, you can easily estimate how many bits you should allocate if you want a F(n). For example, F(100) may have 0.694*100 bits long.
An exponential algorithm One simple idea to is to recursive program the Fibnacci as follows:
int fib(int n) { if(n == 0) return 0; if(n == 1) return 1; return f(n-1) + f(n-2); }
but is it efficient? Let T(n) be the time complexity to compute fib(n). We will easily find that T(n)<=2 for n<=1. You'll find that T(n) = T(n-1) + T(n-2) + 3 It grows as fast as fibonacci!It's an exponential Algorithm. A polynomial algorithm F(100)=F(99)+F(98) F(99)=F(98)+F(97) F(98)= F(97)+F(96) Notice that there're so many computations are repeated.DP? We can DP this problem that it fits exactly what DP needs:
There is an ordering on the subproblems, and a relation that shows how to solve a subproblem given the answers to smaller subproblems, that is, subproblems that appear earlier in the ordering.
int fib(n) { if(n == 0) return 0; int f[n]; f[0] = 0; f[1] = 1; for(i = 2; i < n; i++) f[i] = f[i-1] + f[i-2]; return f[n]; }
More careful analysis Consider the nth Fibonacci, how many bits with n = 100? about 0.694*100 = 70. So the cost of large number operations should be considered in the time complexity,which cost O(n). So the fib algorithms have a cost of O(n^2),still polynomial.
But can we do even better? to be continued...