for (long i = 2; i <= number / i; i++) {
while (number % i == 0) {
number = number / i;
}
}
上述代码的时间复杂度是多少,我该如何证明?
答案 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)