Algorithm 为什么背包问题不能用动态规划算法在多项式时间内求解?
我看到了这个解释,但还是不能完全理解。 如果我们遵循以下逻辑:假设某个算法在O(n)时间内工作,那么: 让我们假设二进制项中的n=1000(4位长) 所以时间复杂度Algorithm 为什么背包问题不能用动态规划算法在多项式时间内求解?,algorithm,complexity-theory,knapsack-problem,Algorithm,Complexity Theory,Knapsack Problem,我看到了这个解释,但还是不能完全理解。 如果我们遵循以下逻辑:假设某个算法在O(n)时间内工作,那么: 让我们假设二进制项中的n=1000(4位长) 所以时间复杂度T(n)=O(8) 让我们把输入的大小增加一倍n=10000000(8位长)T(n)=O(128) 时间以指数形式增加,所以这意味着O(n)不是多项式时间 问题是:“多项式作为什么的函数?”。当我们确定算法的复杂性时,我们通常(但并非总是)将其表示为输入长度的函数。通常,但并非总是,此长度由字母n表示。例如,如果研究涉及图形的问题,字
T(n)=O(8)
让我们把输入的大小增加一倍<代码>n=10000000(8位长)T(n)=O(128)
时间以指数形式增加,所以这意味着O(n)
不是多项式时间
问题是:“多项式作为什么的函数?”。当我们确定算法的复杂性时,我们通常(但并非总是)将其表示为输入长度的函数。通常,但并非总是,此长度由字母n
表示。例如,如果研究涉及图形的问题,字母n
通常用于表示图形中的顶点数量,而不是表示输入的长度
在您的情况下,变量n
是物品的数量,变量W
是行李的容量
因此,数字n
与复杂性相关;但它本身并不是输入的整个长度。让我们调用N
输入的实际长度。尽量不要混淆n
和n
。算法的复杂度必须表示为N
的函数,“线性复杂度”、“多项式复杂度”、“指数复杂度”等术语总是指N
,而不是N
输入的长度是多少
您的输入包括成对的(重量(i)、值(i))
,然后是容量W
。据推测,袋子中的每件物品的重量范围为0
到W
;以及一个从0
到某个最大值V
的值。因此,权重需要与W
一样多的位来表示,值需要与V
一样多的位来表示
如果你对对数和写数字有点了解,你应该知道写一个数字所需的位数与其对数成正比。因此,每个权重需要log(W)
位,每个值需要log(V)
位
因此:N=N*(log(W)+log(V))
你可以说服自己,W
和V
的长度与复杂性有关。这里我们所有的数字都是整数。但想象一下现实世界的问题。重量可以用吨或克表示1吨
与1000000克
相同。价值可以用美分或数万欧元表示。在将现实问题输入算法之前,我们需要选择我们的单位
如果重量以克而不是吨表示,您的算法解决问题是否需要更长的时间
答案是肯定的。因为克比吨精确一百万倍。所以当你用克而不是吨来提问时,你要求的答案要精确一百万倍。因此,该算法将需要更多的时间来找到该解决方案
我希望我能说服您,算法的复杂性应该表示为输入的实际长度的函数,而不仅仅是元素的数量。问题是:“多项式作为什么的函数?”。当我们确定算法的复杂性时,我们通常(但并非总是)将其表示为输入长度的函数。通常,但并非总是,此长度由字母n
表示。例如,如果研究涉及图形的问题,字母n
通常用于表示图形中的顶点数量,而不是表示输入的长度
在您的情况下,变量n
是物品的数量,变量W
是行李的容量
因此,数字n
与复杂性相关;但它本身并不是输入的整个长度。让我们调用N
输入的实际长度。尽量不要混淆n
和n
。算法的复杂度必须表示为N
的函数,“线性复杂度”、“多项式复杂度”、“指数复杂度”等术语总是指N
,而不是N
输入的长度是多少
您的输入包括成对的(重量(i)、值(i))
,然后是容量W
。据推测,袋子中的每件物品的重量范围为0
到W
;以及一个从0
到某个最大值V
的值。因此,权重需要与W
一样多的位来表示,值需要与V
一样多的位来表示
如果你对对数和写数字有点了解,你应该知道写一个数字所需的位数与其对数成正比。因此,每个权重需要log(W)
位,每个值需要log(V)
位
因此:N=N*(log(W)+log(V))
你可以说服自己,W
和V
的长度与复杂性有关。这里我们所有的数字都是整数。但想象一下现实世界的问题。重量可以用吨或克表示1吨
与1000000克
相同。价值可以用美分或数万欧元表示。在将现实问题输入算法之前,我们需要选择我们的单位
如果重量以克而不是吨表示,您的算法解决问题是否需要更长的时间
答案是肯定的。因为