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

别再暴力求素数了!用C++实现埃氏筛和欧拉筛,性能提升百倍(附完整代码)

素数筛法性能优化实战从暴力枚举到欧拉筛的百倍飞跃在算法竞赛和工程开发中素数筛选是一个经典问题。当数据规模达到百万级别时传统的暴力枚举方法往往力不从心。本文将深入探讨三种素数筛选算法——暴力枚举、埃拉托斯特尼筛法埃氏筛和欧拉筛法通过性能对比和原理剖析帮助开发者掌握高效筛选素数的核心技术。1. 素数筛选的常见场景与挑战素数筛选在密码学、哈希算法和数学计算等领域有着广泛应用。在实际开发中我们常遇到以下典型场景LeetCode等编程题库中的素数相关题目如计数质数、素数对等大规模数据预处理时需要快速获取素数列表加密算法中需要高效生成大素数算法竞赛中需要优化时间复杂度以避免超时传统暴力枚举法的时间复杂度为O(n√n)当n10^6时运算量将达到10^9级别在现代计算机上也需要数秒时间。这对于算法竞赛通常时间限制为1-2秒或高频调用的生产环境来说是完全不可接受的。// 暴力判断素数的典型实现 bool isPrime(int n) { if (n 1) return false; for (int i 2; i * i n; i) { if (n % i 0) return false; } return true; }2. 埃氏筛法以空间换时间的优化策略埃拉托斯特尼筛法埃氏筛是第一种有效的素数筛选算法其核心思想是标记非素数初始化一个布尔数组isPrime[]假设所有数都是素数从2开始将所有素数的倍数标记为非素数最后未被标记的数即为素数埃氏筛的时间复杂度为O(n log log n)相比暴力法有显著提升。以下是典型实现vectorint eratosthenes(int n) { vectorbool isPrime(n1, true); vectorint primes; for (int i 2; i n; i) { if (isPrime[i]) { primes.push_back(i); for (long long j (long long)i * i; j n; j i) { isPrime[j] false; } } } return primes; }埃氏筛的优化技巧内层循环从i²开始而非2i避免重复标记使用位运算压缩存储空间每个布尔值只需1bit分段筛法处理超大范围超过内存限制时3. 欧拉筛法线性时间复杂度的终极方案欧拉筛法线性筛通过确保每个合数只被其最小质因数筛除将时间复杂度优化至O(n)。其核心在于i % prime[j] 0时的及时中断vectorint eulerSieve(int n) { vectorint primes; vectorbool isComposite(n1, false); for (int i 2; i n; i) { if (!isComposite[i]) { primes.push_back(i); } for (size_t j 0; j primes.size() i * primes[j] n; j) { isComposite[i * primes[j]] true; if (i % primes[j] 0) break; // 关键优化点 } } return primes; }关键原理剖析每个合数n只会被其最小质因数p筛除一次n p * i当i % prime[j] 0时说明prime[j]已是i的最小质因数后续的prime[j1]不是n的最小质因数故中断该break条件确保每个合数只被标记一次实现线性时间复杂度4. 三种算法性能实测对比我们使用相同的测试环境Intel i7-11800H16GB内存g 11.2.0对三种算法进行基准测试算法类型时间复杂度n1e6耗时(ms)n1e7耗时(ms)内存占用(MB)暴力枚举O(n√n)7852超时(60s)1埃氏筛法O(n log logn)3538012.5欧拉筛法O(n)2225012.5实测发现当n10^7时欧拉筛比埃氏筛快约35%暴力枚举在n10^5时已显吃力约800ms内存占用主要来自标记数组两种筛法相当5. 工程实践中的优化技巧在实际项目中应用素数筛法时还需要考虑以下优化点内存优化方案// 使用bitset压缩存储 bitset10000001 isComposite; // 仅需1.2MB内存n1e7多线程并行优化埃氏筛可分块并行处理不同区间使用不同线程欧拉筛因顺序依赖较难并行化常见陷阱与解决方案数组越界问题// 错误示例未考虑i*prime[j]可能溢出 for (int j 0; j primes.size() i * primes[j] n; j) // 正确写法使用long long for (int j 0; j primes.size() (long long)i * primes[j] n; j)初始化问题// 必须初始化标记数组为false vectorbool isComposite(n1, false); // 明确初始值特殊边界处理if (n 2) return {}; // 处理n0/1的特殊情况在实际项目中我遇到过一个典型案例需要预处理1e8以内的素数用于快速查询。使用欧拉筛法仅需约2秒完成初始化而暴力枚举根本无法完成。这充分证明了算法选择对性能的决定性影响。

相关文章:

别再暴力求素数了!用C++实现埃氏筛和欧拉筛,性能提升百倍(附完整代码)

素数筛法性能优化实战:从暴力枚举到欧拉筛的百倍飞跃 在算法竞赛和工程开发中,素数筛选是一个经典问题。当数据规模达到百万级别时,传统的暴力枚举方法往往力不从心。本文将深入探讨三种素数筛选算法——暴力枚举、埃拉托斯特尼筛法&#xff…...

OpenClaw自动化测试实践:Qwen3.5-9B驱动日志分析与报告生成

OpenClaw自动化测试实践:Qwen3.5-9B驱动日志分析与报告生成 1. 为什么选择OpenClawQwen3.5做测试分析? 去年参与的一个物联网项目让我吃尽了测试日志的苦头——每天要手动分析近千条设备日志,从中筛选异常模式、统计错误类型、整理测试报告…...

视觉障碍辅助:OpenClaw+Phi-3-vision-128k-instruct实时描述周围环境

视觉障碍辅助:OpenClawPhi-3-vision-128k-instruct实时描述周围环境 1. 项目背景与核心需求 去年在帮助一位视障朋友调试智能家居时,我意识到现有环境感知工具存在明显断层——要么是功能单一的"拍照识物"APP,要么是昂贵的企业级…...

Goldpinger完全指南:如何实时可视化Kubernetes节点间网络连接

Goldpinger完全指南:如何实时可视化Kubernetes节点间网络连接 【免费下载链接】goldpinger Debugging tool for Kubernetes which tests and displays connectivity between nodes in the cluster. 项目地址: https://gitcode.com/gh_mirrors/go/goldpinger …...

Arthas实战:5分钟搞定MyBatis Mapper XML热更新(含完整脚本)

Arthas实战:5分钟搞定MyBatis Mapper XML热更新(含完整脚本) 在Java开发中,MyBatis作为一款优秀的持久层框架,其Mapper XML文件的修改往往需要重启应用才能生效。这种开发模式严重影响了开发效率,特别是在测…...

革命性无代码网站构建器Silex:10分钟创建专业静态网站的完整指南

革命性无代码网站构建器Silex:10分钟创建专业静态网站的完整指南 【免费下载链接】Silex Silex is an online tool for visually creating static sites with dynamic data. With the free/libre spirit of internet, together. 项目地址: https://gitcode.com/gh…...

uosc与其他MPV脚本对比:为什么uosc是极简MPV播放器UI的终极选择

uosc与其他MPV脚本对比:为什么uosc是极简MPV播放器UI的终极选择 【免费下载链接】uosc Feature-rich minimalist proximity-based UI for MPV player. 项目地址: https://gitcode.com/gh_mirrors/uo/uosc 在众多MPV播放器UI脚本中,uosc以其独特的…...

OpenClaw开发提效方案:Qwen3-14b_int4_awq辅助日志分析与告警

OpenClaw开发提效方案:Qwen3-14b_int4_awq辅助日志分析与告警 1. 为什么需要AI辅助日志分析 作为一名全栈开发者,我每天要面对数十个微服务的日志文件。最头疼的就是半夜被报警电话吵醒,然后花几个小时在一堆日志中寻找那个导致服务崩溃的关…...

从均值、方差到协方差:拆解SSIM公式,看懂它如何量化图像的亮度、对比度和结构相似性

从均值、方差到协方差:拆解SSIM公式,看懂它如何量化图像的亮度、对比度和结构相似性 当你看到两张几乎相同的照片时,大脑会瞬间判断它们的相似程度。但计算机如何量化这种"看起来像"的感觉?这就是结构相似性指数&#x…...

React-md-editor性能优化:如何提升大型文档编辑体验

React-md-editor性能优化:如何提升大型文档编辑体验 【免费下载链接】react-md-editor A simple markdown editor with preview, implemented with React.js and TypeScript. 项目地址: https://gitcode.com/gh_mirrors/re/react-md-editor React-md-editor…...

OpenClaw汽车保养助手:Qwen2.5-VL-7B解析故障灯照片生成检修指南

OpenClaw汽车保养助手:Qwen2.5-VL-7B解析故障灯照片生成检修指南 1. 为什么需要汽车故障灯智能助手 上周我的车突然亮起了发动机故障灯,黄色警示图标在仪表盘上闪烁。作为一个非专业车主,我面临两个选择:要么花半天时间排队去4S…...

别再死记硬背了!用这5个n8n核心节点,搞定你80%的自动化需求

别再死记硬背了!用这5个n8n核心节点,搞定你80%的自动化需求 每次打开n8n的节点库,就像走进一家琳琅满目的工具超市——HTTP、数据库、AI、邮件、表单...上百种节点让人既兴奋又迷茫。作为过来人,我完全理解那种"每个节点看起…...

Scalatra 异步编程完整指南:构建高性能 Web 服务

Scalatra 异步编程完整指南:构建高性能 Web 服务 【免费下载链接】scalatra Tiny Scala high-performance, async web framework, inspired by Sinatra 项目地址: https://gitcode.com/gh_mirrors/sc/scalatra Scalatra 是一个轻量级、高性能的 Scala Web 微…...

Claude Code 编程哲学正在改变一切:从“理解代码”到“跑通代码”

目录为什么传统 Coding Agent 开始失效向量化代码理解的瓶颈在哪里Claude Code 为什么选择“终端调试范式”CodeGraph:节省 Token,但解决不了核心问题真正的转变:从“看懂代码”到“跑通代码”这套范式对工程实践意味着什么一、为什么传统 Co…...

如何快速掌握Walt Explorer:在线WebAssembly代码编写与调试终极指南

如何快速掌握Walt Explorer:在线WebAssembly代码编写与调试终极指南 【免费下载链接】walt :zap: Walt is a JavaScript-like syntax for WebAssembly text format :zap: 项目地址: https://gitcode.com/gh_mirrors/wa/walt Walt Explorer是一款强大的在线工…...

有能力的已经在投了:这一批AI公司,正在悄悄招人

导读很多人还在盯着互联网大厂,反复刷岗位、反复改简历。但另一批人,已经把简历投向了另一条线——人工智能公司、机器人公司、智能制造公司。这些公司有一个共同点:岗位不多,但含金量极高要求更高,但成长速度更快很多…...

PipelineDB扩展开发指南:如何编写自定义聚合函数

PipelineDB扩展开发指南:如何编写自定义聚合函数 【免费下载链接】pipelinedb High-performance time-series aggregation for PostgreSQL 项目地址: https://gitcode.com/gh_mirrors/pi/pipelinedb PipelineDB作为PostgreSQL的高性能时序聚合扩展&#xff0…...

终极指南:如何利用HTTPS-PORTAL与Docker Gen实现自动HTTPS配置的魔法

终极指南:如何利用HTTPS-PORTAL与Docker Gen实现自动HTTPS配置的魔法 【免费下载链接】https-portal A fully automated HTTPS server powered by Nginx, Lets Encrypt and Docker. 项目地址: https://gitcode.com/gh_mirrors/ht/https-portal HTTPS-PORTAL是…...

ML.NET跨平台开发终极指南:machinelearning-samples Linux与macOS部署详解

ML.NET跨平台开发终极指南:machinelearning-samples Linux与macOS部署详解 【免费下载链接】machinelearning-samples Samples for ML.NET, an open source and cross-platform machine learning framework for .NET. 项目地址: https://gitcode.com/gh_mirrors/m…...

终极指南:如何为Conform.nvim贡献代码并成为开源英雄

终极指南:如何为Conform.nvim贡献代码并成为开源英雄 【免费下载链接】conform.nvim Lightweight yet powerful formatter plugin for Neovim 项目地址: https://gitcode.com/gh_mirrors/co/conform.nvim Conform.nvim是一款轻量级但功能强大的Neovim格式化插…...

RTV主题开发终极指南:如何从零开始创建自定义终端Reddit主题

RTV主题开发终极指南:如何从零开始创建自定义终端Reddit主题 【免费下载链接】rtv Browse Reddit from your terminal 项目地址: https://gitcode.com/gh_mirrors/rt/rtv RTV(Reddit Terminal Viewer)是一个强大的终端Reddit浏览工具&…...

OpenClaw浏览器自动化:千问3.5-35B-A3B-FP8驱动智能爬虫实践

OpenClaw浏览器自动化:千问3.5-35B-A3B-FP8驱动智能爬虫实践 1. 为什么需要AI驱动的浏览器自动化 去年我接手了一个数据采集项目,目标是从几十个电商平台抓取商品信息和用户评价。传统爬虫在遇到验证码、动态加载内容时频繁失效,而人工操作…...

千问3.5-9B多模态扩展:OpenClaw处理图片与文本混合任务

千问3.5-9B多模态扩展:OpenClaw处理图片与文本混合任务 1. 为什么需要本地多模态自动化 去年夏天,我电脑里堆积了上千张混杂着文字说明的截图——有技术文档片段、会议纪要、临时灵感记录。手动整理这些内容时,我突然意识到:如果…...

python mmap

# 聊聊Python里的mmap:把文件当内存用 平时处理文件的时候,大多数人想到的都是open、read、write这些常规操作。但如果你需要处理特别大的文件,或者想在多个进程间共享数据,常规的文件操作就显得有些力不从心了。这时候可以看看mm…...

OpenClaw硬件加速:Qwen3-4B-Thinking在GPU环境下的优化

OpenClaw硬件加速:Qwen3-4B-Thinking在GPU环境下的优化 1. 为什么需要GPU加速OpenClaw 去年冬天,当我第一次在MacBook Pro上运行OpenClaw对接Qwen3-4B模型时,一个简单的文件整理任务竟然花费了3分多钟。看着CPU占用率飙升到100%的风扇狂转&…...

终极指南:pangu.js如何智能识别并保护文件路径的排版规则

终极指南:pangu.js如何智能识别并保护文件路径的排版规则 【免费下载链接】pangu.js Opinionated paranoid text spacing in JavaScript 项目地址: https://gitcode.com/gh_mirrors/pa/pangu.js 如果你经常在技术文档、代码注释或博客文章中看到中英文混排时…...

Whisper JAX自定义模型训练终极指南:从PyTorch到Flax的完整转换流程

Whisper JAX自定义模型训练终极指南:从PyTorch到Flax的完整转换流程 【免费下载链接】whisper-jax JAX implementation of OpenAIs Whisper model for up to 70x speed-up on TPU. 项目地址: https://gitcode.com/gh_mirrors/wh/whisper-jax Whisper JAX是基…...

六挡手动齿轮变速器设计【说明书、CAD图纸、 开题报告、任务书 ……】

六挡手动齿轮变速器作为汽车传动系统的核心部件,其设计需兼顾动力传递效率与驾驶操控性。该变速器通过齿轮组的啮合与分离实现六个前进挡位的切换,每个挡位对应不同的齿轮传动比,既能满足车辆起步时的大扭矩需求,也能在高速巡航时…...

C语言编程中的高级技巧与实用方法

1. C语言编程中那些鲜为人知的实用技巧作为一名嵌入式开发工程师,我经常需要与C语言打交道。虽然C语言看似简单,但它隐藏着许多实用的语法技巧和功能,这些技巧往往能大幅提升代码的可读性和维护性。今天,我将分享几个在实际项目中…...

JAVA自动装箱自动拆箱

自动装箱与自动拆箱深层次讲解自动装箱(Autoboxing)和自动拆箱(Unboxing)是Java语言中的特性,用于简化基本数据类型(如int、double)与其对应包装类(如Integer、Double)之…...