分析代码的复杂性(Fibonacci系列)

时间:2016-11-30 08:21:16

标签: python fibonacci series

这是在python中计算Fibonacci系列的迭代版本:

<img src="{{asset('storage/image.jpg')}}">

这是递归版本:

def fib_iterative(n):
    if n == 0:
        return []
    if n == 1:
        return [1]
    if n == 2:
        return [1,1]
    fib_list = [1,1]
    for i in range(0,n):
        fib_list.append(fib_list[i]+fib_list[i+1])
    return fib_list

每个人的Big-O是什么?

调用fib_numbers_in_list(n)和fib_iterative(n)来返回列表中的前n个Fibonacci数。

有没有办法可以找到一个O(log n)算法来生成n个Fibonacci数?

2 个答案:

答案 0 :(得分:1)

 def fib_iterative(n):
    if n == 0:
        return []
    if n == 1:
        return [1]
    if n == 2:
        return [1,1]
    fib_list = [1,1]
    for i in range(0,n):
        fib_list.append(fib_list[i]+fib_list[i+1])
    return fib_list

此函数有一个for循环,重复n次。 这使得函数O(n)具有时间复杂性。

def fib_recursive(n):
    if n == 1:
        return 1
    elif n == 2:
        return 1
    else:
        return fib(n-1) + fib(n-2)

def fib_numbers_in_list(n):
    fibn = []
    for x in range(1,n+1):
        fibn.append(fib_recursive(x))
    return fibn

我认为在代码中调用fib(n-1) + fib(n-2)时出错。我认为这应该是fib_recursive(n-1) + fib_recursive(n-1)

我们假设fib_recursive(n)f(n)计算要做。估算它的简单方程是f(n) = f(n-1) + f(n-2)。边界条件为f(2) = 1, f(1) = 1。这对你很熟悉吧?递归代码的时间复杂度最终与输入n的斐波纳契数相同。

就像你可能已经知道的那样,第n个斐波纳契数与(2.736) ** n成正比。这使得递归函数的时间复杂度为O(2.736 ** n)。 (如果您想了解更多相关信息,请访问http://mathworld.wolfram.com/FibonacciNumber.html

好吧,我们还没有完成。我们必须将其乘以n,因为您希望知道从1n的所有斐波纳契数。所以慷慨的计算会得到答案O(n * 2.736 ** n)

答案 1 :(得分:0)

你可以在这里查看各种python操作的大O符号来估计时间复杂度: TimeComplexity

以下是一个例子:

example