knapsack problem可以在O(n²V)
时间内解决,其中V = max(v[i], i = 1,..,n)
表示任何项目的最大值。如果我们通过舍入参数θ = ε/n * V
“更改单位”并考虑修改后的值y[i] = ceil(v[i]/θ)
,我们会为任何修复 {{1}获得O(n³/ε)
的运行时间}。
在 Jon Kleinberg 的算法设计一书中,他们说:
对所需精度
ε > 0
的依赖不是多项式的,因为 运行时间包括ε
而不是1/ε
。
首先,对于我来说,伪多项式这个术语背后的整个想法并不完全清楚,尽管我已经阅读了一些关于它的文章。但是,除了这个知识差距之外,我主要问自己,如果运行时间包括log 1/ε
而不是ε
,那么对log 1/ε
的依赖性将是多项式的。
答案 0 :(得分:1)
问题是否是多项式时间取决于其实例的编码方式。例如,我可以定义一个问题PADDED-SATISFIABILITY,其有效实例由一个布尔公式组成,其中包含n个变量,后跟2 ^ n个垃圾位。由于填充,PADDED-SATISFIABILITY可以在多项式时间内解决(不像,可能是SATISFIABILITY,它是NP难的)。
当实例涉及整数时,通常假定编码,其中用于表示正整数的位数约为该整数的log2。在这种情况下,伪多项式时间算法意味着,如果我们从正整数的二进制表示切换到一元,那么它们需要指数(!)更多位来表示,那么算法是多项式时间。
如果我们(频繁)假设1 /ε是正整数,那么Kleinberg指出多项式依赖性将在log 1 /ε上,因为这大约是指定该参数所需的位数在二进制。一元表示中的比特数约为1 /ε。