找到数字的素因子的以下算法的时间复杂度是多少?

时间:2018-01-18 07:40:18

标签: java algorithm time-complexity

for (long i = 2; i <= number / i; i++) {
    while (number % i == 0) {
        number = number / i;
    }
}

上述代码的时间复杂度是多少,我该如何证明?

3 个答案:

答案 0 :(得分:2)

for (long i = 2; i <= number / i; i++) {
    while (number % i == 0) {
        number = number / i;
    }
}

可以写成

for (long i = 2; i * i <= number; i++) {
    while (number % i == 0) {
        number = number / i;
    }
}

for (long i = 2; i <= Math.sqrt(number); i++) {
    while (number % i == 0) {
        number = number / i;
    }
}

因此外部循环最多具有O(N 0.5 )次迭代(如果number不是素数,它将具有更少的迭代,因为内部循环将减少{{的值1}}在那种情况下)。

内部循环的所有迭代的操作总数是原始数字具有的素数因子的数量。如果原始数是2的幂(即它的所有素因子都是2),则原始数将具有最高数量的素因子,在这种情况下,它将具有log 2 N个除法器。

由于log 2 N&lt;对于大多数N值,N 0.5 ,总运行时间为O(N 0.5 )。

答案 1 :(得分:1)

对于像(2 ^ m)(3 ^ n)(5 ^ o)...

这样的数字

时间复杂度为O(m + n + ...)或(数字素因子的最高幂之和)

答案 2 :(得分:0)

我认为如果数字为素数则为O(n)