📜  筛网 cp c++ (1)

📅  最后修改于: 2023-12-03 15:41:08.685000             🧑  作者: Mango

筛网 (Sieve)

筛网是一种快速找出素数的算法。该算法的基本思想是从2开始,将每个质数的倍数都标记成合数,然后再从未被标记的数中找到下一个质数,重复上述步骤。

筛网算法的复杂度为O(n*log(log(n))),是一种高效的筛素数的算法。

算法流程
  1. 初始化一个长度为n+1的bool数组,全部赋值为true。
  2. 从2开始循环至n,如果当前数字的布尔值为true,则将其所有的倍数都标记为false。
  3. 循环结束后,所有未被标记为false的数字都是素数。
实现

下面是C++实现的代码片段:

vector<int> sieve(int n) {
    vector<bool> is_prime(n + 1, true);
    vector<int> primes;
    for (int i = 2; i <= n; ++i) {
        if (is_prime[i]) {
            primes.push_back(i);
            for (int j = i * i; j <= n; j += i) {
                is_prime[j] = false;
            }
        }
    }
    return primes;
}

这个函数的输入参数是正整数n,输出的是一个vector,包含2到n之间的所有素数。

该函数的时间复杂度为O(n*log(log(n))),空间复杂度为O(n)。

优化

下面是一些优化的思路:

  1. 只需要遍历到sqrt(n)即可,因为所有大于sqrt(n)的合数肯定有一个小于sqrt(n)的质因子。
  2. 使用位图节约空间,将bool数组换成unsigned int类型,用位运算来标记数字是否为合数。
  3. 多线程优化,并行处理多个区间的数。
总结

筛网算法是一种高效的找出素数的算法,其实现非常简单,时间复杂度较低。在实际应用中,可以根据自己的需要进行优化,提高执行效率。