打印前n个素数的复杂度
Complexity of print first n prime number
在面试中我被问到这个问题:
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)
但是面试官说outerloop不会直接去n
因为比如要找到前100个质数我们需要循环到541(也就是第100个质数)
那么我们如何表达给定的时间复杂度?
回答这个问题需要高等数学,即素数的分布规律。它告诉你 (https://en.wikipedia.org/wiki/Prime_number_theorem) 第 n
个质数的值大约是 n.log(n)
.
那么你的复杂度是O(n√n.log(n)√log(n))
。
我可能会发现这个界限是悲观的,因为并非所有迭代 运行 直到 √n。例如,立即检测到偶数。对于更严格的界限,您需要整数的最小因子的分布规律。
在面试中我被问到这个问题:
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)
但是面试官说outerloop不会直接去n
因为比如要找到前100个质数我们需要循环到541(也就是第100个质数)
那么我们如何表达给定的时间复杂度?
回答这个问题需要高等数学,即素数的分布规律。它告诉你 (https://en.wikipedia.org/wiki/Prime_number_theorem) 第 n
个质数的值大约是 n.log(n)
.
那么你的复杂度是O(n√n.log(n)√log(n))
。
我可能会发现这个界限是悲观的,因为并非所有迭代 运行 直到 √n。例如,立即检测到偶数。对于更严格的界限,您需要整数的最小因子的分布规律。