我感到困惑的伪多项式时间比较多项式时间伪多项式时间和多项式时间
input(n);
for (int i=0; i<n;i++){
doStuff; }
运行时会O(n)
但写出数n取x=O(log n)
位。因此,如果我们让x是写入输入n所需的位数,则此算法的运行时间实际上是O(2^x)
,这不是x中的多项式。 这个结论是否正确?
编辑:看看简单的素数测试。
function isPrime(n):
for i from 2 to n - 1:
if (n mod i) = 0, return false
return true
运行时将是O(n)
。但是请记住,时间复杂度的正式定义会将算法的复杂性作为输入位数的函数。因此,如果我们让x是写入输入n所需的位数,那么算法的运行时间实际上是O(2^x),它不是x中的多项式。编辑2:我得到了你所有的观点,但看看背包问题。 //输入:
// Values (stored in array v)
// Weights (stored in array w)
// Number of distinct items (n)
// Knapsack capacity (W)
for j from 0 to W do:
m[0, j] := 0
for i from 1 to n do:
for j from 0 to W do:
if w[i] > j then:
m[i, j] := m[i-1, j]
else m[i, j] := max(m[i-1, j], m[i-1, j-w[i]] + v[i])
如果你们是对的那岂不是背包问题具有运行o(n*W)
,因此它具有多项式时间!
编辑我的回答:) –