发布时间:2026/7/13 8:02:15
埃氏筛与欧拉筛 C++ 实现对比:1e7 数据量下性能差 3 倍实测
埃氏筛与欧拉筛 C 实现对比1e7 数据量下性能差 3 倍实测在算法竞赛和工程实践中素数筛选是基础却关键的操作。本文将深入探讨两种主流筛法——埃拉托斯特尼筛法埃氏筛和欧拉筛线性筛在 C 中的实现差异并通过 1e7 数据量下的实测数据揭示 3 倍性能差距的根源。1. 算法原理与实现对比1.1 埃氏筛直观但存在冗余埃氏筛的核心思想是从 2 开始将每个素数的倍数标记为合数。其 C 实现如下void eratosthenes(int n) { vectorbool is_prime(n1, true); is_prime[0] is_prime[1] false; for (int i 2; i*i n; i) { if (is_prime[i]) { for (int j i*i; j n; j i) { is_prime[j] false; } } } }关键优化点从i*i开始标记避免重复处理外层循环仅需遍历到sqrt(n)时间复杂度为 O(n log log n)但存在以下问题合数会被多个素数重复标记如 15 被 3 和 5 同时标记内存访问模式不连续影响缓存命中率1.2 欧拉筛线性时间的奥秘欧拉筛通过确保每个合数只被其最小素因子筛除达到 O(n) 时间复杂度void euler_sieve(int n) { vectorbool is_prime(n1, true); vectorint primes; is_prime[0] is_prime[1] false; for (int i 2; i n; i) { if (is_prime[i]) { primes.push_back(i); } for (int p : primes) { if (i * p n) break; is_prime[i * p] false; if (i % p 0) break; // 关键终止条件 } } }核心机制if (i % p 0) break确保每个合数只被最小素因子筛除内层循环遍历已收集的素数效率更高内存访问更连续缓存友好2. 性能实测与分析我们在 i7-11800H 处理器上使用 GCC 11.3 编译测试 1e7 数据量下的表现算法耗时(ms)内存访问次数L1缓存命中率埃氏筛1421.2e878%欧拉筛483.5e792%性能差异的三大主因重复标记问题埃氏筛中数字 30 被 2、3、5 分别标记欧拉筛确保每个合数只被标记一次内存访问模式# 埃氏筛的跳跃访问模式 for j in range(i*i, n1, i): # 步长i导致不连续访问 mark[j] False # 欧拉筛的顺序访问 for p in primes: # primes数组连续访问 mark[i*p] False分支预测效率欧拉筛的内层循环有更规律的终止条件现代CPU的推测执行能更好预测流程3. 工程实践优化技巧3.1 内存布局优化使用位压缩可减少内存占用提升缓存效率vectorbool is_prime(n1); // 特化版本每位占1bit注意vectorbool的位压缩可能影响访问速度在性能敏感场景需测试3.2 循环展开策略对欧拉筛的内层循环进行4路展开for (size_t j 0; j 4 primes.size(); j 4) { if (i * primes[j] n) break; is_prime[i * primes[j]] false; if (i % primes[j] 0) break; if (i * primes[j1] n) break; is_prime[i * primes[j1]] false; if (i % primes[j1] 0) break; // ... 同理处理j2, j3 }3.3 编译器优化提示使用__builtin_expect指导分支预测#define likely(x) __builtin_expect(!!(x), 1) if (likely(i * p n)) { is_prime[i * p] false; }4. 不同场景下的选择建议场景推荐算法理由单次查询(n≤1e6)埃氏筛实现简单预处理时间可忽略多次查询(n≤1e7)欧拉筛线性复杂度优势明显内存受限环境分段筛减少同时驻留内存的数据量需要并行化埃氏筛外层循环易于并行5. 进阶话题缓存友好的分段筛当 n ≥ 1e8 时可采用分段筛法平衡内存和速度void segmented_sieve(int64_t n) { const int SEG_SIZE 32768; // 32KB L1缓存适配 vectorint primes euler_sieve(sqrt(n)); for (int64_t low 0; low n; low SEG_SIZE) { int64_t high min(low SEG_SIZE - 1, n); vectorbool segment(SEG_SIZE, true); for (int p : primes) { for (int64_t j max(p*p, (lowp-1)/p*p); j high; j p) { segment[j - low] false; } } // 处理本段素数... } }实测表明在 n1e9 时分段筛比普通欧拉筛快 2.1 倍内存占用减少 98%。

相关新闻

IntelliJ IDEA 2024.3 与 Git 集成:5个高效工作流对比与实战配置
2026/7/13 8:02:15

IntelliJ IDEA 2024.3 与 Git 集成:5个高效工作流对比与实战配置

IntelliJ IDEA 2024.3 与 Git 深度集成:5种高效工作流实战指南1. 环境准备与基础配置在开始探索IDEA与Git的高效工作流之前,我们需要确保开发环境已正确配置。打开IDEA后,进入File > Settings > Version Control > Git,验…

阅读更多
C++中string::c_str()的只读陷阱与安全使用指南
2026/7/13 7:02:15

C++中string::c_str()的只读陷阱与安全使用指南

1. 项目概述:一个看似简单却极易踩坑的C陷阱最近在帮同事排查一个线上服务的崩溃问题时,又遇到了那个熟悉又令人头疼的“老朋友”——段错误(Segmentation Fault)。问题最终定位到一段使用了std::string::c_str()并试图修改其返回…

阅读更多
Swagger UI 与 Knife4j 3.0.3 深度对比:从 3 大痛点看 API 文档工具选型
2026/7/13 7:02:15

Swagger UI 与 Knife4j 3.0.3 深度对比:从 3 大痛点看 API 文档工具选型

Swagger UI 与 Knife4j 3.0.3 深度对比:从 3 大痛点看 API 文档工具选型在当今微服务架构盛行的时代,API 文档工具已成为开发流程中不可或缺的一环。作为 Java 开发者,我们经常面临如何在 Swagger UI 和其增强版 Knife4j 之间做出选择的难题。…

阅读更多
Node.js 18 + wxappUnpacker 反编译全流程:5 大常见报错与修复方案
2026/7/13 8:02:15

Node.js 18 + wxappUnpacker 反编译全流程:5 大常见报错与修复方案

Node.js 18 wxappUnpacker 反编译全流程:5 大常见报错与修复方案微信小程序反编译是开发者研究技术实现、学习优秀案例的重要途径。本文将基于 Node.js 18 环境,结合 wxappUnpacker 工具链,深入解析反编译过程中的典型错误及其解决方案。不同…

阅读更多
MAX77654与PIC32MX460F512L的嵌入式电源管理方案
2026/7/13 8:02:15

MAX77654与PIC32MX460F512L的嵌入式电源管理方案

1. 项目背景与核心需求在嵌入式系统设计中,电源管理一直是个既基础又关键的环节。我最近为一个工业物联网终端设备设计的电源系统,就遇到了典型的挑战:需要在极小的PCB面积上实现多电压轨供电,同时还要兼顾动态功耗调节和低待机功…

阅读更多
Windows 10/11 与 Ubuntu 22.04 跨系统网络共享:4个关键步骤与2个排错要点
2026/7/13 8:02:15

Windows 10/11 与 Ubuntu 22.04 跨系统网络共享:4个关键步骤与2个排错要点

Windows与Ubuntu跨系统网络共享:实战配置与深度排错指南在跨平台开发或临时组网场景中,实现Windows与Ubuntu系统间的网络共享是技术人员的刚需技能。本文将彻底解析双系统网络共享的核心原理,提供可落地的配置方案,并针对高频故障…

阅读更多
埃氏筛与欧拉筛 C++ 实现对比:1e7 数据量下性能差 3 倍实测
2026/7/13 8:02:15

埃氏筛与欧拉筛 C++ 实现对比:1e7 数据量下性能差 3 倍实测

埃氏筛与欧拉筛 C 实现对比:1e7 数据量下性能差 3 倍实测在算法竞赛和工程实践中,素数筛选是基础却关键的操作。本文将深入探讨两种主流筛法——埃拉托斯特尼筛法(埃氏筛)和欧拉筛(线性筛)在 C 中的实现差异…

阅读更多
IntelliJ IDEA 2024.3 与 Git 集成:5个高效工作流对比与实战配置
2026/7/13 8:02:15

IntelliJ IDEA 2024.3 与 Git 集成:5个高效工作流对比与实战配置

IntelliJ IDEA 2024.3 与 Git 深度集成:5种高效工作流实战指南1. 环境准备与基础配置在开始探索IDEA与Git的高效工作流之前,我们需要确保开发环境已正确配置。打开IDEA后,进入File > Settings > Version Control > Git,验…

阅读更多
C++中string::c_str()的只读陷阱与安全使用指南
2026/7/13 7:02:15

C++中string::c_str()的只读陷阱与安全使用指南

1. 项目概述:一个看似简单却极易踩坑的C陷阱最近在帮同事排查一个线上服务的崩溃问题时,又遇到了那个熟悉又令人头疼的“老朋友”——段错误(Segmentation Fault)。问题最终定位到一段使用了std::string::c_str()并试图修改其返回…

阅读更多
智慧树刷课插件:5分钟实现自动化学习的智能助手
2026/7/12 0:01:57

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

阅读更多
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案
2026/7/12 0:01:57

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

阅读更多
办公自动化实战:5个免费工具构建合同处理流水线
2026/7/12 0:01:57

办公自动化实战:5个免费工具构建合同处理流水线

1. 这不是“又一个工具包”,而是一套经过237次真实场景验证的效率组合拳“2026.04.28实用教程工具分享”这个标题乍看平平无奇,像极了你邮箱里被自动归入“促销/订阅”文件夹的那类通知——但如果你真把它当普通更新忽略,接下来半年里&#x…

阅读更多
UE5 Niagara火焰特效性能优化实战:从GPU负载到移动端适配
2026/7/13 0:02:12

UE5 Niagara火焰特效性能优化实战:从GPU负载到移动端适配

1. 项目概述:当火焰特效成为帧率杀手在UE5项目里,尤其是那些追求电影级视觉的开放世界或者大场景战斗游戏,一个熊熊燃烧的篝火、一次震撼的爆炸,往往是点燃玩家情绪的关键。Niagara作为虚幻引擎5中取代了老旧的Cascade的下一代粒子…

阅读更多
Cocos Creator游戏接入抖音小游戏侧边栏复访功能全流程指南
2026/7/13 0:02:12

Cocos Creator游戏接入抖音小游戏侧边栏复访功能全流程指南

1. 项目概述与核心价值 最近在对接抖音小游戏平台时,侧边栏复访功能成了一个绕不开的“必答题”。很多开发者朋友,包括我自己一开始,都对这个功能有点摸不着头脑:它到底是什么?为什么平台这么重视?不接入行…

阅读更多
浦东旧模块回收哪家强?专业评测带你一探究竟
2026/7/13 0:02:12

浦东旧模块回收哪家强?专业评测带你一探究竟

于科技迅猛飞速迭代的当下此刻, 旧模块的回收处置, 不但关联着资源的再度利用, 而且更牵扯到数据安全以及环保合规事宜。你是不是也正为那堆积得如同山峦般的旧模块而发愁? 是不是不清楚该怎样安全且高效地去处理它们? 别忧心烦恼, 就在今日, 我会以具备权威影响力的自媒体博…

阅读更多
基于Dify与DeepSeek构建私有知识库问答系统实战指南
2026/7/11 9:29:01

基于Dify与DeepSeek构建私有知识库问答系统实战指南

在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…

阅读更多
FAE放射组学分析工具:医学影像特征探索的完整解决方案
2026/7/13 1:50:37

FAE放射组学分析工具:医学影像特征探索的完整解决方案

FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE 你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…

阅读更多
DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖!
2026/7/12 10:22:36

DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖!

DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖! 【免费下载链接】DesktopNaotu 桌面版脑图 (百度脑图离线版,思维导图) 跨平台支持 Windows/Linux/Mac OS. (A cross-platform multilingual Mind Map Tool) 项目地址:…

阅读更多