【发布时间】:2014-01-25 16:01:42
【问题描述】:
我了解何时可以将给定算法称为伪多项式,但是我无法找到任何地方如何显示它相对于以位数给出的输入大小的指数。我的意思是正式证明输入大小的函数与时间复杂度之间的关系是指数的。 也许根据背包问题解释起来很容易。
是的,我读过这个帖子:What is pseudopolynomial time? How does it differ from polynomial time?
...但这不是我想要的。
提前致谢
【问题讨论】:
我了解何时可以将给定算法称为伪多项式,但是我无法找到任何地方如何显示它相对于以位数给出的输入大小的指数。我的意思是正式证明输入大小的函数与时间复杂度之间的关系是指数的。 也许根据背包问题解释起来很容易。
是的,我读过这个帖子:What is pseudopolynomial time? How does it differ from polynomial time?
...但这不是我想要的。
提前致谢
【问题讨论】:
(那是我的原始帖子,所以我很乐意详细说明!)
我们以子集和问题为例。在这个问题中,我们想要确定是否有一个包含 n 个数字的集合 S 的子集加起来正好为 W。有一个伪多项式时间 DP 算法在时间 O(nW) 中运行。让我们正式证明这是 x 的指数,即输入的位数。
为此,我们需要考虑如何构建此问题的输入。如果我们用简单的英语写出来,我们可以通过将 S 中的所有数字写成逗号分隔的列表来写下问题的输入,并在末尾附加 W 的值。例如,我们可能会写一个问题“是否有 {1, 2, 3, 8, 12} 的子集总和为 5?”通过写作
1,2,3,8,12,5
这是以十进制完成的。如果我们把数字写成二进制,我们得到
1,10,11,1000,1100,101
为了使整个内容适合单个位串,我们需要以某种方式对这些数字和逗号进行编码,并穿插分隔符。为此,我们将使用标准技巧。我们将所有数字的位加倍,并将逗号替换为字符串 01。在这种情况下,我们会得到 p>
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 = 2x = 2Θ(x)。因此,如果算法的运行时间为 O(nW),则运行时间为 O(x 2Θ(x)),它是输入大小的指数。
希望这会有所帮助!
【讨论】: