【问题标题】:Complexity of print first n prime number打印前n个素数的复杂度
【发布时间】:2016-04-07 09:42:25
【问题描述】:

在一次采访中,我被问到了这样的问题:

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)
但是面试官说outerloop不会简单地去n,因为例如要找到前100个质数我们需要循环到541(即第100个质数)

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

【问题讨论】:

  • 附带说明:我更愿意看到divison*divisor &lt;= number,而不是调用Math.sqrt() 并键入强制转换。

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


【解决方案1】:

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

那么你的复杂度是O(n√n.log(n)√log(n))


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

【讨论】:

  • 这是一个众所周知的事实。如果您参加了涵盖 RSA 的密码学课程,您就会了解这一点。也许你在你的简历上声明了类似的东西(例如密码学),然后他们决定对你进行测试。
  • 我同意。您可以回答“我无法给出准确的答案,因为我不知道nn-th 素数之间的关系”。
  • @Yves:我就是这么说的
  • @giò:点是用来消除歧义的,这就足够了。 (而且您自己建立公式也不会有任何问题。)
猜你喜欢
  • 2016-02-16
  • 1970-01-01
  • 2013-03-26
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 2017-03-06
  • 2017-11-24
  • 2022-10-04
相关资源
最近更新 更多