打印的第一个素数的复杂性

时间:2016-04-07 09:42:25

标签: java math time-complexity primes asymptotic-complexity

在一次采访中我得到了这个问题:

Write a function to print first n prime numbers

该功能如下所示:

Live on ideone

while (true) {
  boolean isPrime = true; 
  for (int divisor = 2; divisor <= (int)(Math.sqrt(number)); divisor++) {
    if (number % divisor == 0) {
      isPrime = false;      
      break;
    }
  }
  number++;
  if(isPrime) {
    System.out.print(number + " ");
    primes++;
  }

  if (primes == n)
      break;
}

简单的复杂性分析可能会导致O(n√n) 但是访调员说外环不是简单地n,因为例如找到我们需要循环到541的前100个素数(即第100个素数)

那么我们如何表达时间复杂度?

1 个答案:

答案 0 :(得分:3)

回答这个问题需要很高的数学,即素数的分布规律。它会告诉您(https://en.wikipedia.org/wiki/Prime_number_theoremn - 素数的值约为n.log(n)

然后您的复杂性为O(n√n.log(n)√log(n))

我可能会发现这种约束是悲观的,因为并非所有迭代都会运行直到√n。例如,立即检测偶数。为了更严格的约束,你需要整数最小因子的分布律。