baby sword‘s blog baby sword‘s blog
首页
  • java基础
  • java进阶
大数据
  • mysql

    • mysql索引
    • mysql日志
  • redis

    • 单机下的redis
    • 集群下的redis
  • Spring
  • springboot
  • RPC
  • netty
  • mybatis
  • maven
  • 消息队列
  • kafka
  • zookeeper
  • rocketmq
  • 七大设计原则
  • 创建型模式
  • 结构型模式
  • 行为型模式
  • SpringCloud

    • eureka
  • SpringCloud Alibaba

    • nacos
  • 计算机网络
  • 操作系统
  • 算法
  • 个人项目
  • 个人面试面经
  • 八股记忆
  • 工作积累
  • 逻辑题
  • 面试

    • 百度后端实习二面
GitHub (opens new window)

zhengjian

不敢承担失去的风险,是不可能抓住梦想的
首页
  • java基础
  • java进阶
大数据
  • mysql

    • mysql索引
    • mysql日志
  • redis

    • 单机下的redis
    • 集群下的redis
  • Spring
  • springboot
  • RPC
  • netty
  • mybatis
  • maven
  • 消息队列
  • kafka
  • zookeeper
  • rocketmq
  • 七大设计原则
  • 创建型模式
  • 结构型模式
  • 行为型模式
  • SpringCloud

    • eureka
  • SpringCloud Alibaba

    • nacos
  • 计算机网络
  • 操作系统
  • 算法
  • 个人项目
  • 个人面试面经
  • 八股记忆
  • 工作积累
  • 逻辑题
  • 面试

    • 百度后端实习二面
GitHub (opens new window)
  • 计算机网络

  • 操作系统

  • 算法

    • 常见的排序算法
    • 双向链表模板
    • 如何在海量元素中(例如 10 亿无序、不定长、不重复)快速判断一个元素是否存在
    • 二叉树的遍历
    • 单调栈
    • 二分查找
    • 买卖股票最佳时机
    • 打家劫舍
    • dp题
    • 链表刷题
    • 回溯相关
    • 树相关
    • 二维数组前缀和
    • 哈夫曼树
    • 埃拉托斯特尼筛法
  • 计算机基础
  • 算法
xugaoyi
2023-09-02

埃拉托斯特尼筛法

埃拉托斯特尼筛法(Sieve of Eratosthenes)是一种用于找出一定范围内所有质数的经典算法。它的基本思想是从小到大依次筛选掉合数(非质数),最终剩下的就是质数。以下是详细的步骤说明:

  1. 创建一个布尔数组 isPrime,用于表示每个数字是否为质数。初始化时,将所有数字标记为质数(初始化为 true)。
  2. 根据质数的定义,从 2 开始,将其标记为质数,然后将它的倍数标记为非质数。因为 0 和 1 不是质数,所以我们从 2 开始。
  3. 对于当前的质数 p,从 p * p 开始,将其所有小于等于 n 的倍数标记为非质数。这是因为任何小于 p * p 的倍数已经在之前的质数中被标记过了。例如,当 p 为 2 时,我们从 4 开始标记,因为 2 * 2 = 4。而当 p 为 3 时,我们从 9 开始标记,因为 3 * 3 = 9。
  4. 重复步骤 3,直到 p * p > n。
  5. 最后,遍历布尔数组 isPrime,将所有标记为质数的数字提取出来,形成质数列表。

这个算法的核心思想是,每次找到一个质数,就将其所有的倍数标记为非质数,这样逐步排除了所有的合数,只剩下质数。这种方法避免了重复的除法运算,因此在一定范围内查找质数非常高效。

埃拉托斯特尼筛法的时间复杂度是 O(n log log n),其中 n 是要查找的质数的上限。这使得它成为找出相对较小范围内的质数的一种有效方法。

import java.util.ArrayList;
import java.util.List;

public class PrimeSieve {
    public static List<Integer> findPrimes(int n) {
        // 创建一个布尔数组来标记每个数字是否为质数
        boolean[] isPrime = new boolean[n + 1];
        for (int i = 0; i <= n; i++) {
            isPrime[i] = true; // 先默认所有数字都是质数
        }
        isPrime[0] = isPrime[1] = false; // 0 和 1 不是质数

        // 使用埃拉托斯特尼筛法来标记非质数
        for (int num = 2; num * num <= n; num++) {
            if (isPrime[num]) {
                for (int multiple = num * num; multiple <= n; multiple += num) {
                    isPrime[multiple] = false; // 将num的倍数标记为非质数
                }
            }
        }

        // 将标记为质数的数字放入一个列表中
        List<Integer> primes = new ArrayList<>();
        for (int i = 2; i <= n; i++) {
            if (isPrime[i]) {
                primes.add(i);
            }
        }
        return primes;
    }

    public static void main(String[] args) {
        List<Integer> primesInRange = findPrimes(10000);
        System.out.println(primesInRange);
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
编辑 (opens new window)
上次更新: 2024/02/22, 14:03:19
哈夫曼树

← 哈夫曼树

最近更新
01
spark基础
02-22
02
mysql读写分离和分库分表
02-22
03
数据库迁移
02-22
更多文章>
Theme by Vdoing | Copyright © 2019-2024 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式