Computational complexity of Fibonacci Sequence

后端 未结 11 1467
慢半拍i
慢半拍i 2020-11-21 10:27

I understand Big-O notation, but I don\'t know how to calculate it for many functions. In particular, I\'ve been trying to figure out the computational complexity of the nai

11条回答
  •  星月不相逢
    2020-11-21 10:36

    I agree with pgaur and rickerbh, recursive-fibonacci's complexity is O(2^n).

    I came to the same conclusion by a rather simplistic but I believe still valid reasoning.

    First, it's all about figuring out how many times recursive fibonacci function ( F() from now on ) gets called when calculating the Nth fibonacci number. If it gets called once per number in the sequence 0 to n, then we have O(n), if it gets called n times for each number, then we get O(n*n), or O(n^2), and so on.

    So, when F() is called for a number n, the number of times F() is called for a given number between 0 and n-1 grows as we approach 0.

    As a first impression, it seems to me that if we put it in a visual way, drawing a unit per time F() is called for a given number, wet get a sort of pyramid shape (that is, if we center units horizontally). Something like this:

    n              *
    n-1            **
    n-2           ****  
    ...
    2           ***********
    1       ******************
    0    ***************************
    

    Now, the question is, how fast is the base of this pyramid enlarging as n grows?

    Let's take a real case, for instance F(6)

    F(6)                 *  <-- only once
    F(5)                 *  <-- only once too
    F(4)                 ** 
    F(3)                ****
    F(2)              ********
    F(1)          ****************           <-- 16
    F(0)  ********************************    <-- 32
    

    We see F(0) gets called 32 times, which is 2^5, which for this sample case is 2^(n-1).

    Now, we want to know how many times F(x) gets called at all, and we can see the number of times F(0) is called is only a part of that.

    If we mentally move all the *'s from F(6) to F(2) lines into F(1) line, we see that F(1) and F(0) lines are now equal in length. Which means, total times F() gets called when n=6 is 2x32=64=2^6.

    Now, in terms of complexity:

    O( F(6) ) = O(2^6)
    O( F(n) ) = O(2^n)
    

提交回复
热议问题