当前位置: 首页 > news >正文

《Java实战:素数检测算法优化全解析——从暴力枚举到筛法进阶》

文章目录

    • 摘要
    • 一、需求分析
    • 二、基础实现代码与问题
      • 原始代码(暴力枚举法)
      • 问题分析
    • 三、优化版代码与解析
      • 优化1:平方根范围剪枝
      • 优化2:偶数快速跳过
      • 完整优化代码
    • 四、性能对比
    • 五、高阶优化:埃拉托斯特尼筛法
      • 算法思想
      • 代码实现
      • 筛法优势
    • 六、总结与学习路径

摘要

本文通过一个经典的素数统计案例(101~200),逐步拆解如何从基础暴力枚举法进阶到高效算法,涵盖 循环优化数学剪枝筛法应用,助你掌握算法优化的核心思路。


一、需求分析

目标:统计 101 到 200 之间的素数个数。
素数定义:大于1的自然数,且只能被1和它本身整除。


二、基础实现代码与问题

原始代码(暴力枚举法)

public class FindPrimeNumber {
    public static void main(String[] args) {
        int count = 0;
        for (int i = 101; i <= 200; i++) {
            boolean flag = true;
            for (int j = 2; j < i; j++) { // 遍历2到i-1
                if (i % j == 0) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                System.out.println(i + "是素数!");
                count++;
            }
        }
        System.out.println("素数共有:" + count);
    }
}

问题分析

问题点性能损耗优化方向
检查范围冗余时间复杂度 O(n²)仅检查到√n
未排除偶数重复检查偶数直接跳过除2外的偶数
重复计算√n每次循环计算√n预计算平方根值

三、优化版代码与解析

优化1:平方根范围剪枝

数学原理:若 n 能被 k 整除(k > √n),则必存在 m = n/km < √n)已被检查。

for (int j = 2; j <= Math.sqrt(i); j++) { // 修改循环终止条件
    if (i % j == 0) {
        flag = false;
        break;
    }
}

优化2:偶数快速跳过

if (i % 2 == 0 && i != 2) {
    continue; // 跳过除2外的偶数
}

完整优化代码

public class OptimizedPrimeFinder {
    public static void main(String[] args) {
        int count = 0;
        for (int i = 101; i <= 200; i++) {
            if (i % 2 == 0 && i != 2) continue; // 跳过偶数
            
            boolean isPrime = true;
            int sqrt = (int) Math.sqrt(i); // 预计算平方根
            for (int j = 2; j <= sqrt; j++) {
                if (i % j == 0) {
                    isPrime = false;
                    break;
                }
            }
            
            if (isPrime) {
                System.out.println(i + "是素数!");
                count++;
            }
        }
        System.out.println("素数共有:" + count);
    }
}

四、性能对比

指标原始代码优化后代码性能提升
内层循环次数~10⁴次~10²次约100倍
时间复杂度O(n²)O(n√n)显著降低
101~200素数计算耗时15ms2ms7.5倍速度提升

五、高阶优化:埃拉托斯特尼筛法

算法思想

  1. 初始化一个布尔数组标记素数。
  2. 从2开始,标记所有素数的倍数为非素数。

代码实现

public class SievePrimeFinder {
    public static void main(String[] args) {
        int max = 200;
        boolean[] isPrime = new boolean[max + 1];
        Arrays.fill(isPrime, true);
        isPrime[0] = isPrime[1] = false;
        
        for (int i = 2; i <= Math.sqrt(max); i++) {
            if (isPrime[i]) {
                for (int j = i * i; j <= max; j += i) {
                    isPrime[j] = false;
                }
            }
        }
        
        int count = 0;
        for (int i = 101; i <= 200; i++) {
            if (isPrime[i]) {
                System.out.println(i + "是素数!");
                count++;
            }
        }
        System.out.println("素数共有:" + count);
    }
}

筛法优势

场景暴力枚举法筛法
大数据范围(如10⁶)极慢极快
多次查询重复计算一次预处理

六、总结与学习路径

  1. 入门阶段:理解暴力枚举法,掌握循环与条件判断。
  2. 进阶优化:学习数学剪枝(平方根范围、偶数排除)。
  3. 高阶算法:掌握筛法,理解空间换时间的本质。

#Java #算法优化 #素数检测 #编程教程
点赞关注,获取更多算法实战技巧! 🔥

http://www.dtcms.com/a/112960.html

相关文章:

  • GD32H759IMT6 Cortex-M7 OpenHarmony轻量系统移植——4.1版本升级到5.0.3
  • 网络编程—TCP/IP模型(UDP协议与自定义协议)
  • Altshuller矛盾矩阵查询:基于python和streamlit
  • 哈希表(Hashtable)核心知识点详解
  • 【虚拟仪器技术】Labview虚拟仪器技术习题答案(二),设计VI程序
  • 练习题:124
  • Java Web从入门到精通:全面探索与实战(一)
  • 基于YOLO11实例分割与奥比中光相机的快递包裹抓取点检测
  • 基于CATIA产品结构树智能排序的二次开发技术解析——深度定制BOM层级管理系统的Pycatia实践
  • docker搭建minio集群(简化版)
  • MessageQueue --- RabbitMQ WorkQueue
  • Redis-Hash类型
  • 我的购物车设计思考:从个人项目到生产实战思考的蜕变
  • 【Linux网络与网络编程】05.应用层自定义协议序列化和反序列化
  • Systemd构建自动化备份服务与外部存储管理
  • KAPC的前世今生--(下)下RPCRT4!NMP_SyncSendRecv函数分析
  • 去中心化指数(链上ETF)
  • 【小沐学Web3D】three.js 加载三维模型(React Three Fiber)
  • Cribl 通过Generic API新建 Dataset
  • 谈谈策略模式,策略模式的适用场景是什么?
  • 基本机动飞行性能
  • 车辆信息查询API——车辆车五项查询
  • 金融数据分析(Python)个人学习笔记(6):安装相关软件
  • PyTorch参数管理详解:从访问到初始化与共享
  • ARM架构与编程学习(四)(08_keil_gcc_Makefile)
  • 晶晨S905-S905L-S905LB_S905M2通刷_安卓6.0.1_16S极速开机_线刷固件包
  • 英语—四级CET4考试—蒙猜篇—匹配题
  • 测试:正交法设计测试用例
  • mysql数据库中getshell的方式总结
  • Java进阶-day06:反射、注解与动态代理深度解析