什么是pseudopolynomial time?它与多项式时间有何不同?一些在伪多项式时间内运行的算法的运行时间如O(nW)(对于0/1 Knapsack Problem)或O(√n)(对于trial division);为什么不算作多项式时间?
答案 0 :(得分:1)
伪多项式时间复杂度是指输入值/幅度的多项式,但是输入大小是指数。
大小是指写入输入所需的位数。
从背包的伪代码中,我们可以发现时间复杂度为O(nW)。
// Input:
// Values (stored in array v)
// Weights (stored in array w)
// Number of distinct items (n) //
Knapsack capacity (W)
for w from 0 to W
do m[0, w] := 0
end for
for i from 1 to n do
for j from 0 to W do
if j >= w[i] then
m[i, j] := max(m[i-1, j], m[i-1, j-w[i]] + v[i])
else
m[i, j] := m[i-1, j]
end if
end for
end for
这里,W在输入的长度上不是多项式,这就是伪多项式的原因。
设s是表示W
所需的位数i.e. size of input= s =log(W) (log= log base 2)
-> 2^(s)=2^(log(W))
-> 2^(s)=W (because 2^(log(x)) = x)
现在,running time of knapsack
= O(nW)= O(n * 2 ^ s)
这不是多项式。