给出一个问题,我尝试解决它并假设我找到了一个算法。现在我对该算法进行时间复杂度分析,发现它在多项式时间内运行。现在我怎样才能确保我的算法只在多项式时间而不是伪多项式时间运行?
或者我只是提出我的问题
有没有办法找到算法是否需要伪多项式时间?
例如:
function isPrime(n):
for i from 2 to n - 1:
if (n mod i) = 0, return false
return true
我们认为上述解决方案在多项式时间内起作用,但实际上这个解决方案具有伪多项式复杂度。
答案 0 :(得分:2)
如果有问题,我会尝试解决它并假设我找到了算法。
假设。
现在我对该算法进行时间复杂度分析,发现它在多项式时间内运行。
多项式时间相对于什么?输入的数值或该值的编码长度?
现在我怎样才能确保我的算法只在多项式时间运行而不是伪多项式时间?
如果运行时间受输入编码长度的多项式函数的限制,则算法在多项式时间内运行。如果它的运行时间受到输入值的多项式函数的限制,当它被解释为数字时,它是伪多项式。
或者我只是提出这样的问题:有没有办法找出算法是否需要伪多项式时间?
小心你是否在计算复杂性w.r.t.输入的值或计算机上输入表示的长度(无论计算机是真实物理计算机还是概念计算机,都不会出现这种情况。重要)。
function isPrime(n):
for i from 2 to n - 1:
if (n mod i) = 0, return false
return true
我们认为上述解决方案在多项式时间内起作用,但实际上这个解决方案具有伪多项式复杂度。
此函数的运行时间受n
的多项式函数和输入编码长度的指数函数限制。
确定答案的关键是要意识到输入为n
时输入大小为log_2(n)
(在表示数字为二进制的计算机上)。