因此,当我们进行迭代求解以找到斐波那契数列中的第n个数时,我们运行for循环(n-2)次。这意味着时间复杂度将为O(n)。这是正确的还是它实际上是伪多项式,这取决于输入的位数,就像背包问题一样?
答案 0 :(得分:4)
这里,我假设Fib(n)是计算Fibonacci数的程序的迭代版本。也许是这样的事情:
def Fib(n):
a, b = 0, 1
for _ in xrange(n):
a, b = b, a + b
return a
“Fib(n)是伪多项式”在这种情况下意味着计算Fib受其参数n的多项式限制,但不受大小的多项式函数的限制参数,log(n)。在这种情况下确实如此。
“Fib(n)是O(n)”是关于Fib相对于其参数值的运行时间的陈述。有时候模糊不清“n”是什么,但是这里没有 - 它是Fib的输入,否则“n”会引用原始语句中的两个不同的东西。这是真的(虽然见下面的技术侧面说明)。
“Fib is O(n)”含糊不清。有些人会告诉你n明确提到了论证,还有其他人会告诉你n总是指论证的大小。事实是,这是模棱两可的,如果在上下文中不清楚,你应该说出你的意思(或者如果你听到它就会问它是什么意思并且感到困惑)。一个不模糊的背景是当你谈论P / NP问题的类时 - 它假设复杂性总是相对于输入的大小。
Fib(n)的迭代版本执行O(n)算术运算,但它的O(n)时间是否取决于您的计算模型,特别是它是否可以在O(1)时间内执行任意整数算术运算。就个人而言,我要小心并说“Fib(n)执行O(n)算术运算”而不是“Fib(n)是O(n)” - 如果你绘制Fib(n)的运行时间,你会发现它在实践中不是线性时间,因为对于所有基本操作来说,真正的bignum实现肯定不是O(1)。
答案 1 :(得分:0)
是的,它实际上是O(n)。背包问题的时间复杂性是一个非常奇怪的问题,并且是一个例外。