我开始研究计算复杂性,BigOh符号等等,我的任务是执行整数分解算法并确定其复杂性。我编写了算法并且它正在运行,但我在计算复杂性方面遇到了麻烦。伪代码如下:
DEF fact (INT n)
BEGIN
INT i
FOR (i -> 2 TO i <= n / i STEP 1)
DO
WHILE ((n MOD i) = 0)
DO
PRINT("%int X", i)
n -> n / i
DONE
DONE
IF (n > 1)
THEN
PRINT("%int", n)
END
我认为我试图做的是非常错误的:
f(x)= n-1 + n-1 + 1 + 1 = 2n
所以
f(n)= O(n)
我认为这是错误的,因为分解算法应该在计算上很难,它们甚至不能是多项式的。那么你有什么建议来帮助我?也许我在这个夜晚太累了,我把这一切搞砸了:(
提前谢谢。
答案 0 :(得分:27)
这种现象被称为 pseudopolynomiality :这种复杂性似乎是多项式的,但实际上并非如此。如果您询问某个复杂度(此处为 n )是否为多项式,则必须查看复杂性与输入的大小的关系。在大多数情况下,例如排序(例如合并排序可以在 O(n lg n)中解决), n 描述输入的大小(元素的数量) 。但是,在这种情况下, n 不描述输入的大小; 是输入值。那么, n 的大小是多少?一个自然的选择是 n 中的位数,大约是 lg n 。因此,让 w = lg n 为 n 的大小。现在我们看到 O(n)= O(2 ^(lg n))= O(2 ^ w) - 换句话说,输入大小 w 的指数
(注意 O(n)= O(2 ^(lg n))= O(2 ^ w)总是为真;问题是输入大小是否由 n 或 w = lg n 描述。另外,如果 n 描述列表中元素的数量,则应严格执行说出计算列表中每个元素的位数以获得总输入大小;但是,人们通常假设在列表中,所有数字的大小都是有限的(例如32位)。
答案 1 :(得分:0)
使用您的算法递归的事实。如果f(x)是因子的操作数,如果n是找到的第一个因子,则f(x)=(n-1)+ f(x / n)。任何保理算法的最坏情况是素数,算法的复杂度为O(n)。
保理算法“很难”,主要是因为它们用于大量的数字。
答案 2 :(得分:0)
在big-O表示法中,n
是输入的大小,而不是输入本身(如您的情况)。输入的大小为lg(n)
位。所以基本上你的算法是指数级的。