Algorithm 如果背包是指数的,为什么从1到n的循环是线性的?

Algorithm 如果背包是指数的,为什么从1到n的循环是线性的?,algorithm,knapsack-problem,np,np-complete,Algorithm,Knapsack Problem,Np,Np Complete,我在这里读了很多关于StackOverflow的问题,他们都提出了一个很好的观点:背包问题的DP方法的复杂性是O(nW),它是W中位数的指数。也就是说,如果我再向W添加一个位,我需要两倍的循环 算法大致如下: For i = 0 to n For w = 0 to W //Stuff 但是如果我看一个像从1到n(=n(n+1)/2)求和这样的算法,我只会有一个for循环。如果我将表示n所需的位数增加1,那么我需要做两倍的循环。那么这也是指数吗 我唯一可能的理解是,在这种情况下

我在这里读了很多关于StackOverflow的问题,他们都提出了一个很好的观点:背包问题的DP方法的复杂性是O(nW),它是W中位数的指数。也就是说,如果我再向W添加一个位,我需要两倍的循环

算法大致如下:

For i = 0 to n
   For w = 0 to W
      //Stuff
但是如果我看一个像从1到n(=n(n+1)/2)求和这样的算法,我只会有一个for循环。如果我将表示n所需的位数增加1,那么我需要做两倍的循环。那么这也是指数吗

我唯一可能的理解是,在这种情况下,输入的大小是“n”,而在背包中,输入的大小是表示W所需的位数。但是,。。。为什么?为什么这两种尺寸不同?这些环看起来是一样的


谢谢

是的,您给出的从1到n求和的算法在其输入(即O(log(n))位的大小上需要指数时间,就像背包DP算法一样。这两种算法通常被称为“伪多项式”算法,因为尽管它们在输入大小上采用时间指数,但它们在输入值上仍然只采用时间多项式。好问题,顺便说一句。另一个例子是:要将给定的数字k作为因子,只需运行从1到k的循环变量i,试图在每次迭代时将k除以i。整数除法是多项式时间,所以这似乎表明整数的因式分解也是多项式时间。。。但它不是,因为输入k的大小不是k,它只是O(logk)位。谢谢,我想我明白了。我必须看看输入的大小。我仍然很确定我听到有人说求和算法是线性的,这并没有让我震惊。。。有没有像“价值的复杂性”和“规模的复杂性”这样的东西?或者只是人们弄错了?感谢是人们经常感到困惑的事情。问题的一部分在于,没有一种完全清晰、正式的方式来编码问题的输入。。。只是(通常)一种“标准”编码。例如,如果要声明权重W必须以一元形式指定(即作为1位序列),则需要O(W)位来编码值W,因此运行时间O(nW)在输入大小n+W中确实是多项式;-)是的,您给出的从1到n求和的算法在其输入(即O(log(n))位的大小上需要指数时间,就像背包DP算法一样。这两种算法通常被称为“伪多项式”算法,因为尽管它们在输入大小上采用时间指数,但它们在输入值上仍然只采用时间多项式。好问题,顺便说一句。另一个例子是:要将给定的数字k作为因子,只需运行从1到k的循环变量i,试图在每次迭代时将k除以i。整数除法是多项式时间,所以这似乎表明整数的因式分解也是多项式时间。。。但它不是,因为输入k的大小不是k,它只是O(logk)位。谢谢,我想我明白了。我必须看看输入的大小。我仍然很确定我听到有人说求和算法是线性的,这并没有让我震惊。。。有没有像“价值的复杂性”和“规模的复杂性”这样的东西?或者只是人们弄错了?感谢是人们经常感到困惑的事情。问题的一部分在于,没有一种完全清晰、正式的方式来编码问题的输入。。。只是(通常)一种“标准”编码。例如,如果要声明权重W必须以一元形式指定(即作为1位序列),则需要O(W)位来编码值W,因此运行时间O(nW)在输入大小n+W中确实是多项式;-)