Algorithm 确定整数分解算法的复杂度

Algorithm 确定整数分解算法的复杂度,algorithm,complexity-theory,big-o,factorization,Algorithm,Complexity Theory,Big O,Factorization,我开始研究计算复杂性,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)

我开始研究计算复杂性,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
DEF事实(INT n)
开始
INT i
对于(i->2至i n/i)
完成
完成
如果(n>1)
然后
打印(“%int”,n)
结束
我认为,我试图做的是极其错误的:

f(x)=n-1+n-1+1+1=2n

所以

f(n)=O(n)

我认为这是错误的,因为分解算法应该很难计算,它们甚至不能是多项式。那么你有什么建议来帮助我吗?也许我只是在晚上这个时候太累了,我把这一切都搞砸了:(

提前谢谢。

这种现象被称为:一种似乎是多项式的复杂度,但实际上不是。如果你问某个复杂度(这里,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^(lgn))=O(2^w)总是正确的;问题是输入大小是由n还是由w=lg n来描述。此外,如果n描述列表中元素的数量,严格来说,应该计算列表中每个元素的位,以获得总输入大小;但是,通常假设列表中所有数字的大小都是有界的(例如,32位)。

使用算法是递归的这一事实。如果f(x)是计算因子的操作数,如果n是找到的第一个因子,那么f(x)=(n-1)+f(x/n)。任何因子分解算法的最坏情况都是素数,对于素数,算法的复杂度为O(n)


分解算法之所以“困难”,主要是因为它们用于非常大的数字。

在大O表示法中,
n
是输入的大小,而不是输入本身(如您的情况)。输入的大小是
lg(n)
位。所以基本上你的算法是指数的。

很好的解释!但是,如果我们假设n上的运算不是原子步,而是依赖于n的大小w,那么我们还需要考虑模和除法都不是常数,而是O(w ln w…),因此整个算法的最坏情况复杂度不能是O(2^w)或者更确切地说,因式分解算法是“困难的”,因为它们不能有效地扩展到大的数字。