【发布时间】:2015-08-28 12:00:27
【问题描述】:
寻找前'n'个素数的算法是:
while (number <= n) {
boolean isPrime = true;
for (int divisor = 2; divisor <= (int)(Math.sqrt(number)); divisor++) {
if (number % divisor == 0) {
isPrime = false;
break;
}
}
if(isPrime)
System.out.print(number + " ");
}
《Java 编程简介》一书对此算法的 big-O 计算如下:
由于在for 循环中检查数 i 是否为素数需要 √i 步,因此该算法需要 √2 + √3 + √4 + ... + √n 步才能找到所有小于的素数或等于 n。
注意,
√2 + √3 + √4 + ... + √n
因此,该算法的时间复杂度为 O(n√n)。
问:
1. 他说,“在for 循环中检查数字 i 是否为素数需要 √i 步”。
你不觉得应该是(√i-1)个步骤吗?
2.请说明方法
√2 + √3 + √4 + ... + √n
(我知道如果你只是用随机数替换'n',我知道这种关系成立。我需要解释)
【问题讨论】:
-
它是否需要 sqrt(i) 或 sqrt(i)-1 步骤并不真正相关,这只是一个常数因素。如果你把n个常数因子加起来,你会得到所有的平方根-n,
O(n*log(n))和O(n*log(n) - n)一样,你只需要看最高的项。 -
对于您的第一个答案,复杂度 √i-1 用于查找数字是否为素数。但是要找到直到 n 的所有数字,我将花费 n√n 作为 n 次循环将执行 n 次,并且每次将花费 √i-1 来检查该数字是否为素数,因此总体上将是 n√n。我希望我回答了你的疑问
-
错了,你需要保留两个计数器来打印前n个数字。例如,第 100 个素数是 541
标签: algorithm big-o time-complexity