如何优化代码以减少时间复杂度?
时间: 2024-12-21 10:21:55 浏览: 5
在上述埃拉托斯特尼筛法的优化方面,我们可以考虑以下两点:
1. **空间效率**:原始版本会创建一个大小为`m+1`的布尔数组,但实际上我们只需要遍历到`sqrt(m)`,因为大于`sqrt(m)`的因子一定有一个小于或等于它的平方根。所以可以把数组大小限制为`int(sqrt(m)) + 1`。
2. **避免无效更新**:当我们发现某个数`p`的倍数时,实际上是从`p*p`开始的,而不是从`2*p`。因为我们已经处理过`p`作为素数的情况了。所以只需跳过`p*p`后的倍数即可,即`i += p`改为`i += 2 * p`。
优化后的代码大致如下:
```cpp
void optimizedPrintPrimesBetween(int n, int m) {
bool primes[m+1]; // 优化为只保留到sqrt(m)
memset(primes, true, sizeof(primes));
primes[0] = primes[1] = false;
// 只需要遍历到 sqrt(m)
for (int p=2; p*p<=m; p++) {
if (primes[p]) {
// 更新范围从 p*p 到 m,每次增加 p 的两倍
for (int i=p*p; i<=m; i += 2 * p)
primes[i] = false;
}
}
// 输出结果
for (int i=(n >= 2 ? 2 : n); primes[i] && i < m; i++)
cout << i << " ";
}
```
通过这两种优化,我们可以有效地减少空间需求并提高查找素数的速度。特别是当`n`和`m`较大时,效果更为显著。
阅读全文