打印第 n 个素数的复杂度

giò*_*giò 1 java math primes time-complexity asymptotic-complexity

在一次采访中,我被问到了以下问题:

Write a function to print first n prime numbers
Run Code Online (Sandbox Code Playgroud)

该函数如下所示:

住在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;
}
Run Code Online (Sandbox Code Playgroud)

一个简单的复杂性分析可能会导致O(n?n)
但是面试官说,outerloop 不会仅仅n因为例如找到前 100 个质数,我们需要循环到 541(即第 100 个质数)

那么我们如何表达给定的时间复杂度呢?

Yve*_*ust 5

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

那么你的复杂性是O(n?n.log(n)?log(n)).


我可能会发现这个界限是悲观的,因为并不是所有的迭代都运行到?n。例如,立即检测偶数。对于更严格的界限,您需要整数的最小因子的分布规律。

  • 我同意。您可能会回答“我无法给出准确的答案,因为我不知道 `n` 和 `n` 个素数之间的关系”。 (2认同)