伪多项式算法 - 数学

时间:2014-01-07 19:57:48

标签: complexity-theory

我理解当给定算法可以被称为伪多项式时,但是我找不到任何地方如何显示它相对于以位数给出的输入大小的指数。我在这里的意思是形式证明输入大小函数和时间复杂度之间的关系是指数的。 也许基于背包问题很容易解释。

是的,我已阅读此主题:What is pseudopolynomial time? How does it differ from polynomial time?

......但这不是我想要的。

提前致谢

1 个答案:

答案 0 :(得分:1)

(那是我原来的帖子,所以我很乐意详细说明!)

我们以子集和问题为例。在这个问题中,我们想确定是否存在n个数集的S的子集,其恰好与W相加。存在一个在时间O(nW)内运行的伪多项式时间DP算法。让我们正式表明这是x的指数,即输入的位数。

为此,我们需要考虑如何构建此问题的输入。如果我们用简单的英语写出来,我们可以通过将S中的所有数字写成以逗号分隔的列表来写下问题的输入,并在末尾附加W的值。例如,我们可能会写一个问题“是否有{1,2,3,8,12}的子集总和达到5?”通过写作

1,2,3,8,12,5

这是以十进制形式完成的。如果我们用二进制编写数字,我们得到

1,10,11,1000,1100,101

为了使整个事物适合单个字符串,我们需要以某种方式编码这些数字和逗号,并使用分隔符散布。为此,我们将使用标准技巧。我们将所有数字的位加倍,并用字符串01替换逗号。在这种情况下,我们得到

110111000111110111000000011111000001110011

我们可以通过读取大小为2的块来解码此输入。每次读取00时,我们都知道它为0.每次读取11时,我们都知道它是1.每次读取01时,我们都知道'我读完了一个数字,应该从下一个开始。

那么这里需要多少位?好吧,如果有n个数字,我们将有n个分隔符,需要2n个比特。如果数字本身总共有b位,我们需要2b空间来存储它们。最后,我们需要lg W位以二进制形式写出W,因此我们需要2 lg W位来写出W.这意味着总位数(表示为x)满足

  

x = 2(n + b + lg W)

现在看看我们算法的运行时间,即O(nW)。如果我们的输入集由数字1的n个副本组成,那么我们输入的大小将是2(n + 1 + lgW)= 2n + 2 + 2 lg W.如果我们现在选择W等于2 n ,则输入的大小为2n + 2 + 2n = 4n + 2.这意味着x = 4n + 2,因此n =Θ(x)且W = 2 x = 2 Θ(x)。因此,如果算法的运行时间为O(nW),则运行时为O(x 2 Θ(x)),这是输入大小的指数。

希望这有帮助!