质因数算法的复杂度
Complexity of prime factor algorithm
我刚刚研究了如何使用 this 算法找到一个数的质因数,基本上是这样工作的:
void printPrimeFactors(N) {
while N is even
print 2 as prime factor
N = N/2
// At this point N is odd
for all the ODDS i from 3 to sqrt(N)
while N is divisible by i
print i as prime factor
N = N / i
if N hasn't been divided by anything (i.e. it's still N)
N is prime
}
一切都清楚了,但是我不确定如何计算上面程序的 big-O 复杂度。
除法是最昂贵的操作(我想),我想说最坏的情况下可能有最多 log(N) 个除法,但我不完全确定这一点。
您可以这样进行。首先,我们只对 N
非常大时应用程序的行为感兴趣。在那种情况下,我们可以简化很多:如果两个部分具有不同的渐近性能,我们只需要表现最差的那个。
第一个while
最多可以循环m
次,其中m
是最小的整数,所以2m>=N
。因此,在最坏的情况下,它会循环 log2N
次——这意味着它的执行时间为 O(log N
)。请注意,当 N
足够大时,日志类型无关紧要。
for
循环 运行s O(sqrt N
) 次。在规模上,这比日志 N
大得多,因此我们可以删除日志。
最后,我们需要计算循环内的while
。由于此 while 循环仅针对除数执行,因此它将有一个等于除数的大 O。稍加思考我们可以看到,在最坏的情况下,while
将循环 log3N
次,因为 3 是可能的最小除数。
因此,while 循环仅执行 O(log N
) 次,但外部 for
执行 O(sqrt N
) 次(通常是 while 循环不会 运行 因为当前数字不会相除)。
总而言之,花费时间最长的部分是 for
循环,这将使算法的运行时间复杂度为 O(sqrtN
)。
我刚刚研究了如何使用 this 算法找到一个数的质因数,基本上是这样工作的:
void printPrimeFactors(N) {
while N is even
print 2 as prime factor
N = N/2
// At this point N is odd
for all the ODDS i from 3 to sqrt(N)
while N is divisible by i
print i as prime factor
N = N / i
if N hasn't been divided by anything (i.e. it's still N)
N is prime
}
一切都清楚了,但是我不确定如何计算上面程序的 big-O 复杂度。
除法是最昂贵的操作(我想),我想说最坏的情况下可能有最多 log(N) 个除法,但我不完全确定这一点。
您可以这样进行。首先,我们只对 N
非常大时应用程序的行为感兴趣。在那种情况下,我们可以简化很多:如果两个部分具有不同的渐近性能,我们只需要表现最差的那个。
第一个while
最多可以循环m
次,其中m
是最小的整数,所以2m>=N
。因此,在最坏的情况下,它会循环 log2N
次——这意味着它的执行时间为 O(log N
)。请注意,当 N
足够大时,日志类型无关紧要。
for
循环 运行s O(sqrt N
) 次。在规模上,这比日志 N
大得多,因此我们可以删除日志。
最后,我们需要计算循环内的while
。由于此 while 循环仅针对除数执行,因此它将有一个等于除数的大 O。稍加思考我们可以看到,在最坏的情况下,while
将循环 log3N
次,因为 3 是可能的最小除数。
因此,while 循环仅执行 O(log N
) 次,但外部 for
执行 O(sqrt N
) 次(通常是 while 循环不会 运行 因为当前数字不会相除)。
总而言之,花费时间最长的部分是 for
循环,这将使算法的运行时间复杂度为 O(sqrtN
)。