埃氏筛法极限优化
时间: 2025-06-20 15:28:24 浏览: 8
### 埃氏筛法的极限优化实现
埃氏筛法是一种经典的算法,用于筛选出一定范围内的所有素数。通过对其优化,可以显著降低时间复杂度和空间复杂度,从而在更大的数据范围内高效运行。
以下是一个经过极限优化的埃氏筛法实现:
#### 代码实现
```cpp
#include <iostream>
#include <vector>
using namespace std;
void optimizedEratosthenesSieve(int N) {
vector<bool> vis(N + 1, false); // 初始化为false,表示所有数都是素数
vector<int> primes; // 存储素数的数组
for (int i = 2; i <= N; ++i) {
if (!vis[i]) { // 如果i是素数
primes.push_back(i); // 将i加入素数列表
// 筛掉所有i的倍数
if ((long long)i * i <= N) { // 避免溢出,同时减少不必要的计算
for (int j = i * i; j <= N; j += i) {
vis[j] = true; // 标记i的倍数为非素数
}
}
}
}
// 输出所有素数
for (const auto& prime : primes) {
cout << prime << " ";
}
}
int main() {
int N;
cin >> N;
optimizedEratosthenesSieve(N);
return 0;
}
```
#### 关键点解析
1. **减少不必要的计算**:只从 \( i^2 \) 开始标记倍数,因为小于 \( i^2 \) 的倍数已经在之前的循环中被标记过了[^2]。
2. **避免溢出**:在判断 \( i^2 \leq N \) 时,使用 `long long` 类型以防止整型溢出[^4]。
3. **提前退出**:当 \( i^2 > N \) 时,无需继续标记倍数,因此可以跳过这部分计算[^5]。
#### 时间复杂度分析
优化后的埃氏筛法时间复杂度为 \( O(n \cdot \log(\log n)) \),在 \( n \) 较大时接近线性复杂度[^3]。这种优化方法能够在 \( n \) 达到 \( 10^7 \) 或更高时仍然保持高效。
#### 空间复杂度分析
空间复杂度为 \( O(n) \),需要一个大小为 \( n+1 \) 的布尔数组来记录每个数是否为素数[^1]。
---
阅读全文
相关推荐
















