《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-1if (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/k(m < √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素数计算耗时 | 15ms | 2ms | 7.5倍速度提升 |
五、高阶优化:埃拉托斯特尼筛法
算法思想
- 初始化一个布尔数组标记素数。
- 从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⁶) | 极慢 | 极快 |
| 多次查询 | 重复计算 | 一次预处理 |
六、总结与学习路径
- 入门阶段:理解暴力枚举法,掌握循环与条件判断。
- 进阶优化:学习数学剪枝(平方根范围、偶数排除)。
- 高阶算法:掌握筛法,理解空间换时间的本质。
#Java #算法优化 #素数检测 #编程教程
点赞关注,获取更多算法实战技巧! 🔥
相关文章:
《Java实战:素数检测算法优化全解析——从暴力枚举到筛法进阶》
文章目录 摘要一、需求分析二、基础实现代码与问题原始代码(暴力枚举法)问题分析 三、优化版代码与解析优化1:平方根范围剪枝优化2:偶数快速跳过完整优化代码 四、性能对比五、高阶优化:埃拉托斯特尼筛法算法思想代码实…...
基于Python+Flask的服装零售商城APP方案,用到了DeepSeek AI、个性化推荐和AR虚拟试衣功能
首先创建项目结构: fashion_store/ ├── backend/ │ ├── app/ │ │ ├── __init__.py │ │ ├── models/ │ │ ├── routes/ │ │ ├── services/ │ │ └── utils/ │ ├── config.py │ ├── requirements.t…...
二,<FastApi>FastApi的两个核心组件
FastAPI的两个核心组件Pydantic和Starlette。 Starlette 负责Web部分(Asyncio),Starlette Starlette是一个轻量级的ASGI框架/工具包,非常适合在Python构建异步Web服务。 它已经准备好生产,并为您提供以下内容: 轻巧的低复杂性HTTP Web框架。W…...
Docker设置代理
目录 前言创建代理文件重载守护进程并重启Docker检查代理验证 前言 拉取flowable/flowable-ui失败,用DaoCloud源也没拉下来,不知道是不是没同步。索性想用代理拉镜像。在此记录一下。 创建代理文件 创建docker代理配置 sudo mkdir -p /etc/systemd/s…...
一键自动备份:数据安全的双重保障
随着数字化时代的到来,数据已成为企业和个人不可或缺的核心资产。在享受数据带来的便捷与高效的同时,数据丢失的风险也随之增加。因此,备份文件的重要性不言而喻。本文将深入探讨备份文件的重要性,并介绍两种实用的自动备份方法&a…...
HeidiSQL:多数据库管理工具
HeidiSQL 是一款广受欢迎的免费开源数据库管理工具,专为数据库管理员及开发者设计。无论您是刚接触数据库领域的新手,还是需要同时处理多种数据库系统的专业开发者,该工具都能凭借其直观的界面和强大的功能,助您轻松完成数据管理任…...
医药档案区块链系统
1. 医生用户模块 目标用户:医护人员 核心功能: 检索档案:通过关键词或筛选条件快速定位患者健康档案。请求授权:向个人用户发起档案访问权限申请,需经对方确认。查看档案…...
【Python学习】列表/元组等容器的常用内置函数详解
文章目录 map使用示例: filter示例:注意事项: sortedsorted() 与 list.sort() 的区别: any示例: all示例: any 与 all 的对比zip示例:常见用途: enumerate示例:常见用途&…...
蓝桥云客--浓缩咖啡液
4.浓缩咖啡液【算法赛】 - 蓝桥云课 问题描述 蓝桥杯备赛选手小蓝最近刷题刷到犯困,决定靠咖啡续命。他手上有 N 种浓缩咖啡液,浓度分别是 A1%, A2%, …, AN%,每种存货都是无限的。为了提神又不炸脑,小蓝需要按比例混合这…...
SQLark(百灵连接):一款面向信创应用开发者的数据库开发和管理工具
SQLark(百灵连接)是一款面向信创应用开发者的数据库开发和管理工具,用于快速查询、创建和管理不同类型的数据库系统。 目前可以支持达梦数据库、Oracle 以及 MySQL。 SQL 智能编辑器 基于语法语义解析实现代码补全能力,为你提供…...
计算机视觉——为什么 mAP 是目标检测的黄金标准
概述 在目标检测领域,有一个指标被广泛认为是衡量模型性能的“黄金标准”,它就是 mAP(Mean Average Precision,平均精确率均值)。如果你曾经接触过目标检测模型(如 YOLO、Faster R-CNN 或 SSD)…...
Frame Of Reference压缩算法
文章目录 1_概述2_算法基本步骤3_过程优化4_优势以及局限5_模拟实现6_总结 1_概述 Frame of Reference(FoR)压缩算法 是一种用于压缩数值数据的算法,特别是在处理大规模数据集时,利用数据的局部性和重复性来减少存储和传输的开销…...
1.0 软件测试全流程解析:从计划到总结的完整指南
软件测试全流程解析:从计划到总结的完整指南 摘要 本文档详细介绍了软件测试的完整流程,包括测试计划、测试设计、测试执行、测试报告和测试总结等主要阶段。每个阶段都从目标、主要工作、输出物和注意事项等方面进行了详细说明。通过本文档࿰…...
嵌入式AI简介
嵌入式AI是一种将人工智能算法部署在终端设备中运行的技术,使智能硬件能够在本地实时完成感知、交互和决策功能,无需依赖云端计算。以下是其核心要点: 一、核心特点 1. 本地化处理:数据在设备端直接处理,无需联网&a…...
esp32cam 开发板搭载ov3660摄像头在arduino中调用kimi进行图像识别
首先呢,最近搞一个项目,需要一个摄像头拍摄图片 就买了个ov3660开发板,用的esp32S芯片 淘宝商家给的教程是arduino的,所以先用arduino跑起来 arduino配置esp32-cam开发环境 - 简书1、安装arduino https://www.arduino.cc/en/Main/Software?setlang=cn 2、配置esp32 打开…...
二十种中药果实识别分类系统,Python/resnet18/pytorch
二十种中药果实识别分类系统,Python/resnet18/pytorch 基于pytorch训练, resnet18网络,可用于训练其他分类问题,也可自己重新训练 20类中药材具体包括:(1) 补骨脂,(2) 草豆蔻,(3) 川楝子,(4) 地肤子&…...
如何实现两个视频融合EasyCVR平台的数据同步?详细步骤指南
有用户咨询,现场需要数据库同步,如何将两个EasyCVR平台的数据进行同步呢? 这篇文章我们将详细介绍如何通过简单的接口调用,高效完成两个平台的数据同步操作。 1)获取token 使用Postman调用登录接口,获取…...
WindowsPE文件格式入门05.PE加载器LoadPE
https://bpsend.net/thread-316-1-1.html LoadPE - pe 加载器 壳的前身 如果想访问一个程序运行起来的内存,一种方法就是跨进程读写内存,但是跨进程读写内存需要来回调用api,不如直接访问地址来得方便,那么如果我们需要直接访问地址,该怎么做呢?.需要把dll注进程,注进去的代码…...
使用Cusor 生成 Figma UI 设计稿
一、开发环境 系统:MacOS 软件版本: Figma(网页或APP版) 注:最好是app版,网页版figma 没有选项 import from manifest app下载地址:Figma Downloads | Web Design App for Desktops & …...
Golang的文件同步与备份
Golang的文件同步与备份 一、Golang介绍 也称为Go语言,是谷歌开发的一种编程语言,具有高效的并发编程能力和出色的内存管理。由于其快速的编译速度和强大的标准库,Golang在网络应用、云平台和大数据等领域得到了广泛应用。 二、文件同步与备份…...
如何用人工智能大模型,进行作业批改?
今天我们学习人工智能大模型如何进行作业批改。手把手学习视频请访问https://edu.csdn.net/learn/40402/666452 第一步,进入讯飞星火。打开google浏览器,输入百度地址后,搜索”讯飞星火”,在搜索的结果中,点第一个讯飞…...
MATLAB之数据分析图系列 三
三维堆叠柱状图 Bar3StackPlot.m文件 clc; clear; close all; %三维堆叠柱状图 %% 数据准备 % 读取数据 load data.mat % 初始化 dataset X; s 0.4; % 柱子宽度 n size(dataset,3); % 堆叠组数%% 图片尺寸设置(单位:厘米) figureUnits c…...
python爬虫:DrissionPage实战教程
如果本文章看不懂可以看看上一篇文章,加强自己的基础:爬虫自动化工具:DrissionPage-CSDN博客 案例解析: 前提:我们以ChromiumPage为主,写代码工具使用Pycharm(python环境3.9-3.10) …...
一、STM32简介
一、实验器材介绍 二、STM32简介 1.STM32 名词解释 STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器。 ST,指ST公司(意法半导体);M,MicroController 微控制器(MCU,MicroController Unit 微控制器单元/单片机&…...
[ctfshow web入门] web2
前置知识 js是可以写在网页中,用于控制网页行为,例如现在表现出无法使用F12,常见用法校验前台登录时输入的邮箱格式是否正确 view-source协议是一种早期就存在的协议,基本上所有主流浏览器都支持这一协议,因此用户…...
torch 拆分子张量 分割张量
目录 unbind拆分子张量 1. 沿着第n个维度拆分(即按“批次”拆分) split分割张量 常用用法: 总结: unbind拆分子张量 import torchquaternions torch.tensor([[1, 2, 3, 4], [5, 6, 7, 8]]) result torch.unbind(quaternio…...
定制一款国密浏览器(2):修改包名
在上一章中,介绍了 chromium 源码的获取和构建deb 包,这一章将修改包名。 我给定制浏览器取名 Mojo Browser,Mojo 这个词来自 Chromium 代码中的 Mojo 跨进程框架,此外 Mojo 隐含有突破困境的内在动力的意思。 所以接下修改包名为 org.mojo.browser,第二就是修改程序的安…...
使用MATIO库读取Matlab数据文件中的多维数组
使用MATIO库读取Matlab数据文件中的多维数组 MATIO是一个用于读写Matlab数据文件(.mat)的开源C库。下面是一个完整的示例程序,展示如何使用MATIO库读取Matlab数据文件中的多维数组。 示例程序 #include <stdio.h> #include <stdlib.h> #include <…...
MySQL篇(五)MySQL主从同步原理深度剖析
MySQL篇(五)MySQL主从同步原理深度剖析 MySQL篇(五)MySQL主从同步原理深度剖析一、引言二、MySQL主从同步基础概念主库(Master)从库(Slave)二进制日志(Binary Log&#x…...
PyQt5和OpenCV车牌识别系统
有需要请加文章底部Q哦 可远程调试 PyQt5和OpenCV车牌识别系统 一 介绍 此车牌识别系统基于PyQt5和OpenCV开发,蓝牌,新能源(绿牌),黄牌,白牌均可以准确识别,支持中文识别,可以导出识别结果(Excel格式)。此…...
