什么是假多项式时间?它与多项式时间有何不同?

时间:2013-10-29 00:38:48

标签: algorithm big-o time-complexity

什么是pseudopolynomial time?它与多项式时间有何不同?一些在伪多项式时间内运行的算法的运行时间如O(nW)(对于0/1 Knapsack Problem)或O(√n)(对于trial division);为什么不算作多项式时间?

1 个答案:

答案 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) 这不是多项式。