我刚研究了如何使用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)分割,但我并不完全确定这一点。
答案 0 :(得分:1)
您可以像这样继续。首先,当N
非常大时,我们只对应用程序的行为感兴趣。在这种情况下,我们可以简化很多:如果两个部分具有不同的渐近性能,我们只需要采用性能最差的部分。
第一个while
最多可循环m
次,其中m
是最小整数,因此2 m > = N
。因此,它会在最坏的情况下循环log 2 N
次 - 这意味着它将执行为O(log N
)。请注意,当N
足够大时,日志类型无关紧要。
for
循环运行O(sqrt N
)次。在规模上,这比log N
更重要,因此我们可以删除日志。
最后,我们需要评估循环内的while
。由于while循环仅针对除数执行,因此它将具有等于其数量的大O.虽然我们可以看到,在最坏的情况下,while
将循环记录 3 N
次,因为3是可能的最小除数。
因此,while循环仅执行O(log N
)次,但外部for
执行O(sqrt N
)次(并且通常while循环没有' t run因为当前的数字不会分开。)
总之,花费时间最长的部分是for
循环,这将使算法变为O(sqrt N
)。