找到第一个' 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 + " ");
}
这本书&#34; java编程简介&#34;,为这个算法计算big-O:
由于在for
循环中需要√i步骤来检查数字i是否为素数,因此该算法采用√2+√3+√4+ ... +√n步骤来查找所有素数小于或等于n。
观察,
√2+√3+√4+ ... +√n&lt; =n√n
因此,该算法的时间复杂度为O(n√n)。
阙:
1。他说,&#34;在for
循环中需要√i步骤来检查数字i是否为素数&#34;。
你认为不应该是(√i-1)步骤。
2. 请说明如何
√2+√3+√4+ ... +√n&lt; =n√n
(我知道如果你用一个随机数替换&#39; n&#39;我需要解释),这种关系就成立了。
答案 0 :(得分:7)
floor(√n) - 1
。)你有n - 1个词。 添加√n - 1次:
√n+√n+√n+ ... +√n=(n-1)√n&lt; =n√n
由于√2,√3,√4,......都小于√n,因此
√2 + √3 + √4 + ... + √n <= √n + √n + √n + ... + √n <= n√n
答案 1 :(得分:1)
表示0&lt; i&lt; = n我们有i&lt; = n,因此√i&lt; =√n,因此i的总和为1和n <= 1和n之间的√n之和√n+ √n... +√n,n次
答案 2 :(得分:0)
(注意这不是一个完整的答案,只是为了加入@molbdnilo回答)
考虑一下:
1 + 2 + 3 + ... + n = n * (n+1) / 2
- &gt;时间复杂度为O(n*(n+1)/2) == O(n^2)
eventhough (n * (n+1) / 2) <= (n^2)
现在考虑一下@molbdnilo解释的内容;
由于√2,√3,√4,......都小于√n,因此
√2+√3+√4+ ... +√n&lt; =√n+√n+√n+ ... +√n&lt; =n√n
希望它能解决一些疑虑