我们知道背包问题可以通过动态规划在O(nW)的时间复杂度内得到解决。但是我们称这是一个NP完全问题。我感觉这里很难理解。(n代表物品数量,W代表最大容量)
O(n*W)
看起来像是多项式时间,但实际上它不是,它是伪多项式时间。
时间复杂度衡量算法作为其输入位数的长度的函数所花费的时间。动态规划解决方案确实是线性的W
值,但W
长度的指数级别才是重要的!
更准确地说,背包问题的动态规划解决方案的时间复杂度基本上由嵌套循环给出:
// here goes other stuff we don't care about
for (i = 1 to n)
for (j = 0 to W)
// here goes other stuff
O(n*W)
。n
,n+1
,n+2
,...)和逐渐更长的W
(因此,如果W
长位,经过一步后我们使用x+1
位,然后是x+2
位,...)。 但是,W
的值随着x
呈指数级增长,因此该算法实际上不是多项式函数,而是指数函数(但它看起来像是多项式函数,因此得名“伪多项式”)。
W
和n
代表的是循环迭代次数。您可以以任何方式对它们进行编码,那个循环仍将迭代n*W
次。我认为之所以称其为“伪多项式”,是因为n
是实际的输入大小,而W
可以比n
大得多,因此不能公平地视为常数。 - The1111
到n
(其中n
是输入的值)的for
循环;在这种情况下,当循环执行10^12次时,输入的大小仍然约为40位。迭代次数增长的速度比编码输入所需的位数快。时间复杂度 不是 线性的。__2)__同样地,考虑一个for
循环,它遍历一个大小为n
的输入数组,从1
到n
进行迭代;如果你有10^12次迭代,那么意味着你的数组包含10^12个项目。迭代次数与输入大小以相同的速度增长。时间复杂度是线性的。 - Zsolt Safrany一切取决于您在 O(...)
中放入哪些参数。
如果目标重量受数字 W
的限制,则问题的复杂度为 O(n*W)
,就像您所提到的那样。
但是,如果重量过大,并且您需要具有与 W
无关的复杂度的算法,则问题是 NP 完全问题。 (在最朴素的实现中,复杂度为 O(2^n*n)
)。
log(W)
位(对于“值”和“重量”数组为O(n)
)。j = log(W)
(而不仅仅是W
)。 因此,W = 2ʲ
(使用二进制)。O(n * W)
因此,该解决方案不是多项式的。这个
O(n * W)
可以重写为O(n * 2ʲ)
,其与输入大小的指数相关。