我一直在搜索伪多项式时间。 我有一个尚未解决的问题。 例如,0-1背包算法的时间复杂度为O(NW)。 N是物品的数量,W是背包的大小。 它是伪多项式,因为时间复杂度为O(W 中的N×2 位)。
然后,我认为O(在中的2 位W 中的2 位)对于时间复杂度是可能的。但是为什么0-1背包算法只是伪多项式,因为' W'不是' N'?
答案 0 :(得分:0)
因为它大约是输入的大小,而不是它的值。 N
是数组的大小。 W
只是一个价值。
我喜欢认为它是伪多项式,因为如果我们用二进制(或更大)表示法编码W
,它会以指数方式表现,但如果我们在unary representation编码W
,它表现为“多项式”。
但是N
这不是真的。不管我们对输入数组进行编码的表示,时间函数总是表现为多项式。
这有一个实际的结果是创建一个需要很长时间才能处理的输入是多么容易。如果我们要攻击N
,我们必须创建一个包含N
元素的数组。但是如果我们选择W
,就像创建一个具有单个大值的数组一样容易(使用log2 W
位)。
答案 1 :(得分:0)
请注意,N
表示您拥有的元素数量,每个元素都表示为(w_i,c_i)
(权重,成本) - 因此整体输入大小为Omega(n)
- 因为它必须包含所有n
元素。
但是,W
是一个大小,输入只包含数字,但由于您需要log(W)位来表示大小,因此输入大小为Omega(log(W))
总之,我们说背包(例如)是伪多项式 - 因为它不是INPUT大小的多项式,它是指数的,因为它需要O(N*2^b)
时间,输入大小是O(N+b)
- 所以它需要相对于输入大小的指数时间。