在一次采访中我得到了这个问题:
Write a function to print first n prime numbers
该功能如下所示:
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个素数)
那么我们如何表达时间复杂度?
答案 0 :(得分:3)
回答这个问题需要很高的数学,即素数的分布规律。它会告诉您(https://en.wikipedia.org/wiki/Prime_number_theorem)n
- 素数的值约为n.log(n)
。
然后您的复杂性为O(n√n.log(n)√log(n))
。
我可能会发现这种约束是悲观的,因为并非所有迭代都会运行直到√n。例如,立即检测偶数。为了更严格的约束,你需要整数最小因子的分布律。