C++质数判断算法的时间测试

测试标准

同时,使用两类情况进行测试:

质数判断算法

很显然,判断n是不是质数,最简单的只要暴力从2到n过一遍就可以了

template  bool isPrime(IntT n) {
    if (n

分析:最坏情况(是质数)每个都遍历一遍,时间复杂度(O(n)),平均情况由于质数分布也是(O(n))

容易推出,若一个数n不是质数,则它必然有一个因数(F\le\sqrt{n})。因此,只需要判断 [2-(\sqrt n)]之间的数即可。

template  bool isPrime(IntT n) {
    if (n

分析:时间复杂度降为(O(\sqrt n))

再想一想就会发现,我们对于2、3的倍数做了太多次重复运算:一个数模2不等于0,那么它模4、6、8也都不会等于0;3也一样。这些重复在6次的周期内会重复4次。因此,我们可以考虑优化它们,即:
除特殊情况外,只需考虑因数为(6n-1)和(6n+1)的情况(n为正整数)

template bool isPrime(IntT n) {
    if (n

分析:虽然时间复杂度没降,但速度显著提升了

这里就不详细讲解了,主要是运用已知的质数遍历,减少求范围内质数时重复的遍历次数(筛法都会更耗空间)。

(注:这里加了个小小的优化,在第二层循环里,j初始化为 i*i

template IntT get_primes_num(IntT n) {
    if (n

时间复杂度为(O(n\ln\ln n))(这一堆原理自己搜去,我自己也讲不清楚)

对于埃氏筛法的进一步优化

template IntT get_primes_num(IntT n) {
    if (n

时间复杂度为(O(n))。注意:在n不大的时候,欧拉筛法与埃氏筛法比并不具有绝对优势,还有可能被反超(毕竟只是优化了个(\ln\ln n)),几乎相当于拼常数

好了,接下来就是我们的核心——测试环节了。我这里在本机使用了一个基于 std::chrono的封装计时库(程序主体部分运行至少6s)。记录以微秒(μs,百万分之一秒)为单位。
(windows x64 AMDRyzen5-5600H)

回顾一下两种情况:

平均用时(μs) 情况1 情况2 暴力遍历 647,400 8,800,000 平方优化 3,985 3,496 6n优化 1,363 1,163 埃氏筛 154.5 35,000 欧拉筛 265.5 50,000

平时做算法题的时候,如果说是 从1或者一个较小的数开始计数的,那么建议使用 埃氏筛(欧拉筛实现起来更烦,还不一定拼得过加了优化的埃式筛法(ps:优化加了容易数据容易溢出,建议用 unsigned long long),要么去掉优化老老实实用 j=2i);
反之,如果是都在一个较高位的,那么建议使用 6n优化,容易写,比平方优化效率也高很多。这时候再使用两次筛法的差值,时间就容易爆掉(就算一次也容易爆时间)。

好了,以上就是本人对C++质数判断算法的时间测试的所有内容了,初次创作,如有错误欢迎指出ヾ(^▽^*)))

Original: https://www.cnblogs.com/cup11/p/16441262.html
Author: cup11
Title: C++质数判断算法的时间测试

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/713433/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 使用vue全家桶制作博客网站

    前面的话 笔者在做一个完整的博客上线项目,包括前台、后台、后端接口和服务器配置。本文将详细介绍使用vue全家桶制作的博客网站 概述 该项目是基于vue全家桶(vue、vue-rou…

    技术杂谈 2023年5月31日
    0106
  • 基于jsp+servlet的房屋租赁管理系统。

    运行环境,jdk1.8或者jdk1.7、tomcat8或者tomcat8.5、mysql5.7、eclipse、myeclipse开发环境。 1、🐧1748741328,基于jsp…

    技术杂谈 2023年5月31日
    079
  • ios自动布局优秀框架总结

    1、PureLayout 最终的API为iOS和OS X自动布局-令人印象深刻的简单,非常强大。PureLayout扩展了UIView/NSView, NSArray和NSLayo…

    技术杂谈 2023年5月30日
    0104
  • iOS_三角函数

    角度转弧度,弧度转角度 1、 三角函数double sin (double);正弦double cos (double);余弦double tan (double);正切2 、反三…

    技术杂谈 2023年5月30日
    085
  • Docker容器网络(七)

    文章目录 概述 docker创建的默认网络 查看当前运行容器的网络 常用的网络驱动程序 * 自定义的network bridge(桥接网络驱动程序) overlay(覆盖网络驱动程…

    技术杂谈 2023年7月24日
    0108
  • 使用Prometheus的blackbox_exporter进行网络监控

    完整的kubernetes部署文件 123456789101112131415161718192021222324252627282930313233343536373839404…

    技术杂谈 2023年6月1日
    0101
  • Mstar 平台(648)唤醒之串口唤醒

    串口唤醒功能主要是从supernova 待机进入PM后,串口接收PC端口发送过来的特定字串,然后将主板唤醒的功能。与IR,KEYPAD,WOL,CEC,MHL 等等基本流程一致,触…

    技术杂谈 2023年5月31日
    0123
  • Docker 安装&卸载

    不同版本可能有差异具体信息查看官网 官网:https://docs.docker.com/engine/install/centos/ 安装 #环境准备 #查看环境 uname -…

    技术杂谈 2023年7月24日
    079
  • SVN还原项目到某一版本

    将本地的项目通过SVN还原到某一版本,并将SVN服务器上的项目也还原到这一版本 第一步:新建一个文件夹,如test,选中test右键-checkout到最新版本 第二步:选中tes…

    技术杂谈 2023年5月31日
    081
  • 危险的赌注

    低代码应用平台(LCAP – Low Code Application Platforms)在多样、复杂的现代软件开发情势下应运而生。根据 Gartner 的数据,Me…

    技术杂谈 2023年6月21日
    0165
  • ElasticSearch学习笔记(详细)

    ElasticSearch概述 ElasticSearch入门 安装 基本操作 查看es相关信息 索引操作 文档操作 bulk批量API 进阶检索 Search API Query…

    技术杂谈 2023年7月10日
    083
  • windows media play javascript 全屏 单击事件

    上面代码放在HTML页面中, 倒数三行的设置,是对应如果你要做JAVASCRIPT里是否要获取到,0是false,只是不明白为什么-1是true, 然后在HTML里面加入 docu…

    技术杂谈 2023年7月11日
    079
  • Ubuntu 18.04安装sysv-rc-conf

    sudo nano /etc/apt/sources.list 加入deb http://archive.ubuntu.com/ubun…

    技术杂谈 2023年7月11日
    072
  • clang 分四步编译main.c

    这里用的clang/clang++ 分四步编译main.c/main.cpp文件 1.1 C++源文件 #include int main() { std::cout <&l…

    技术杂谈 2023年7月10日
    058
  • kubernetes sigs kind

    github.comhttps://github.com/kubernetes-sigs/kind kind – Quick Starthttps://kind.sigs.k8s….

    技术杂谈 2023年6月1日
    0105
  • Java中流水编号的生成

    在开发中,遇到这样一个需求,在介质资料新增时,需要生成一个介质编号,格式为”JZ+yyyyMMdd+4位递增数字”先是使用百度找寻解决方法。解决方法 里面的…

    技术杂谈 2023年7月24日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球