我想了解为什么以下朴素素性测试算法不是多项式。
IsPrime (n: an integer)
Begin
For i=2 to n-1 do
If (n % i == 0) then
return (no)
EndIf
EndFor
return (yes)
End
据说该算法在输入 n 的大小上是指数的。为什么会这样呢?为什么以下排序测试算法是多项式而不是指数式的?
IsSorted (T[n]: an array of n integer)
Begin
For i = 1 to n-1 do
If (T[i] > T[i+1]) then
return (no)
EndIf
EndFor
return (yes)
End
答案 0 :(得分:4)
输入大小通常以位为单位。为了表示数字n,输入大小将为log2(n)。原始素数检验在n中是线性的,但在log2(n)中是指数的。
答案 1 :(得分:0)
第二个亨利给出的答案,实际上,原始问题中的算法具有多项式限定的运行时间-如果将一元编码用于输入!
更确切地说,运行时范围不仅取决于算法本身,还取决于所使用的编码方案。考虑类似C语法的以下算法。
INPUT: integer n
for (int i = 0; i < n; i++)
{
wait one second
}
显然,算法需要n
秒才能终止;时间在n
中是线性的。如果输入是使用一元编码编码的,则时间量将按n
的编码长度线性变化。但是,如果n
使用 binary encoding 进行编码,则时间量将按n
的编码长度呈指数增长(因为n
的编码长度按对数形式按比例增长n
的值。)
总而言之,关于问题中的算法为非多项式且没有任何其他信息的说法是不正确的。但是,显然,除非另有说明,否则使用二进制编码(或任何其他位置表示法)是一种惯例。
话虽这么说,我还是认为在编码方案上绑定运行时的依赖往往会被不精确地教导。术语伪多项式也随处可见。
答案 2 :(得分:0)
朴素的主要测试是输入项的值(即函数接收的实际数)的多项式,而指数的大小(位,字节等)。
如果您有一个由n
位组成的数字b
,则我们有b = O(log n)
和n = O(2b)
。
运行时间因此为O(n)
或O(2b)
。