Language agnostic 为什么背包问题是伪多项式?

Language agnostic 为什么背包问题是伪多项式?,language-agnostic,complexity-theory,dynamic-programming,knapsack-problem,Language Agnostic,Complexity Theory,Dynamic Programming,Knapsack Problem,我知道背包是NP完全的,而DP可以解决它。他们说DP解决方案是伪多项式,因为它是“输入长度”(即编码输入所需的位数)的指数。不幸的是,我没有得到它。有人能慢慢地向我解释一下伪多项式吗?对于一个有N个项目和大小为W的背包的无界背包问题,运行时间是O(NW)。但是W在输入长度上不是多项式,这就是为什么它是伪多项式 考虑W=10000000000。它只需要40位来表示这个数字,因此输入大小=40,但计算运行时使用因子10000000000,即O(240) 因此,更准确地说,运行时间是O(N.2bits

我知道
背包
是NP完全的,而DP可以解决它。他们说DP解决方案是伪多项式,因为它是“输入长度”(即编码输入所需的位数)的指数。不幸的是,我没有得到它。有人能慢慢地向我解释一下伪多项式吗?

对于一个有N个项目和大小为W的背包的无界背包问题,运行时间是O(NW)。但是W在输入长度上不是多项式,这就是为什么它是伪多项式

考虑W=10000000000。它只需要40位来表示这个数字,因此输入大小=40,但计算运行时使用因子10000000000,即O(240)

因此,更准确地说,运行时间是O(N.2bits in W),它是指数型的

另见:


背包算法的运行时间不仅取决于输入的大小(n-项数),还取决于输入的大小(W-背包容量)O(nW),其在计算机中以二进制(2^n)表示的方式是指数的。计算复杂性(即计算机内部如何通过位进行处理)只关心输入的大小,而不关心其大小/值

暂时忽略值/权重列表。假设我们有一个背包容量为2的实例。W将在输入数据中取两位。现在,我们将背包容量增加到4,保留其余的输入。我们的输入只增加了一位,但计算复杂度增加了两倍。如果我们将容量增加到1024,W的输入将只有10位,而不是2位,但复杂性增加了512倍。以二进制(或十进制)表示,时间复杂度在W的大小上呈指数增长

另一个帮助我理解伪多项式概念的简单例子是朴素素性测试算法。对于给定的数字n,我们检查它是否被范围2内的每个整数平均除。。√n、 因此,该算法需要√(n)−1) 步骤。但这里,n是输入的大小,而不是大小

                     Now The regular O(n) case
相比之下,在数组中搜索给定元素的时间为多项式时间:O(n)。它最多需要n个步骤,这里n是输入的大小(数组的长度)

[见此]


在我们的大多数问题中,我们处理的是适合标准int/float数据类型的大量数字列表。由于大多数处理器一次处理4-8字节数字的方式不需要额外的成本(相对于适合的数字,比如说1字节),我们很少会遇到在实际问题中遇到的范围内将数字放大或缩小而导致运行时间发生变化,因此主要因素仍然是数据点的数量,我们习惯使用的n或m因子

(可以想象,Big-O表示法隐藏了一个常数因子,它将每个数据分为32位或64位,只要我们的每一个数字都能容纳这么多位或更少位,就只剩下数据点的数量)

但是,请尝试使用其他算法对涉及大整数的数据集(需要8个以上字节来表示的数字)进行修改,看看这对运行时有何影响。即使在二进制排序等其他算法中,一旦扩展到安全缓冲区之外,所涉及的数字的大小总是会产生差异。传统处理器通过处理4-8字节的批处理为我们提供“免费”


我们讨论的背包算法的诀窍是,它(相对于其他算法)对特定参数W的大小异常敏感。在W上加一位,算法的运行时间就会翻倍。在此之前,我们还没有在其他算法中看到这种对值变化的戏剧性响应,这就是为什么我们可能会以不同的方式对待背包-但这是一个真正的分析,它如何以非多项式方式响应输入大小的变化。

我理解这一点的方式是,容量应该是O(W)如果容量输入是[1,2,…,W]的数组,其大小为W。但容量输入不是数字数组,而是单个整数。时间复杂度是关于输入的大小的关系。整数的大小不是整数的值,而是表示整数的位数。我们后来在算法中将这个整数W转换成一个数组[1,2,…,W],导致人们错误地认为W是大小,但这个数组不是输入,整数本身就是


将输入视为“一个内容数组”,大小视为“数组中有多少内容”。项目输入实际上是数组中n个项目的数组,因此size=n容量输入不是其中W个数字的数组,而是单个整数,由对数(W)位数组表示。将它的大小增加1(添加1个有意义的位),W加倍运行双倍时间,因此指数时间复杂度。

因此,对于最后一个搜索示例,为什么不把N看作二进制呢?如果n=1024,它也只需要10位,那么它不应该是伪多项式吗?引用“0-1背包问题的动态规划复杂性”的链接#3的可能重复已经死了。对不起,我没有得到它。假设我们有一个时间复杂度为O(N)的算法,那么我们有O(2^(N中的位)),这是指数的?谢谢~@LushaLi这帮了我:。如果N是一个数组,其中每个元素都有一个固定的最大大小输入(即数组中的每个元素不超过32位),并且您在该数组上运行了一次for循环,那么它是数组输入大小N中的多项式时间算法。然而,如果N是一个整数,您运行一个循环