素因子算法的复杂性

时间:2015-07-20 15:18:47

标签: algorithm language-agnostic complexity-theory

我刚研究了如何使用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)分割,但我并不完全确定这一点。

1 个答案:

答案 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)。