博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
几种简单的求素数算法的复杂度分析
阅读量:7209 次
发布时间:2019-06-29

本文共 1538 字,大约阅读时间需要 5 分钟。

素数的算法有很多种,现在主要讲两种算法及其改进版本的复杂度分析,解释性能提升的幅度。同时应用一个素数定理:素数的平方一定是合数,那么在范围内最大数的开方范围内找不到能整除的数,那么这个数是素数。应用这个定理可以将取模范围的空间复杂度从O(n)降为O(n**0.5).现以求100000内素数为例,两种算法分别是:      1.基础思路是去掉偶数,包括取模的范围,代码如下:

print(2)

for i in range(3,100000,2):
  for a in range(3,int(i**0.5)+1,2):
    if i%a == 0:
     break
    else:
     print(i,end = ' ')
'''

*此两层循环的算法的计算复杂度为(0.5*n*((n**0.5)+1)/2),空间复杂度为O(n**1.5)          2.应用一个素数定理:大于6的素数一定与6的倍数相邻,代码如下:              '''                print(2,3,end = ' ')                 n = 100000                 i = 5           step = 2                while i<= n:                         for j in range(5,int(i**0.5)+1,2):                                if j%j == 0:                                    break                            else:                                    count += 1                            i += step                            step = 4 if step ==2 else 2                                    '''
  1. 此算法的计算复杂度为(n/3052)(n0.5+1)/2(将总范围分成30为一块,则6的倍数有5个,相邻的数就是10个),空间复杂度同样为O(n1.5)

    优化思路:                 对于1号算法,我们知道末尾是5的数一定能被5整除,所以末位是5的数一定不是素数,j计算复杂度可以降为0.4*n*((n**0.5+1)*0.4)。不是偶数且末为不是5,就剩(1,3,7,9),所以4/10=0.4,第二层循环也是如此。优化效率提升56%(0.5**2/0.4**2-1=0.56)。                 对于2号算法,思路也是刨去末位为5的数。例如,30~60这一块内,6的倍数有(36,42,48,54,60),相邻的数是(35,37,41,43,47,49,53,55,59,61),有两个末位是5的数(35,55),所以将总范围分成30为一块,只需计算8个数,优化后空间复杂度为(n/30*(5*2-2))*(n**0.5+1)*0.4=4/15*n*(n**0.5+1)*0.4。相比优化后的1号算法,优化后的2号算法效率提升50%(其余项约分,只剩0.4/(4/15),所以0.4/(4/15)-1=0.5)。                综上可见,降低算法复杂度是提高解决问题效率的不二法门。

转载于:https://blog.51cto.com/13886271/2154947

你可能感兴趣的文章
PHP——通过下拉列表选择时间(转)
查看>>
由1433端口入侵,浅谈sqlserver安全 (转)
查看>>
2个YUV视频拼接技术
查看>>
spring data实现自定义的repository实现类,实现跟jpa联通
查看>>
“惊群”,看看nginx是怎么解决它的
查看>>
Theano3.3-练习之逻辑回归
查看>>
利用RGB-D数据进行人体检测 带dataset
查看>>
live555的编译及使用
查看>>
C++builder XE 安装控件 及输出路径
查看>>
优点和阵列的缺点,并且一个链表
查看>>
CSS3透明属性opacity
查看>>
Genymotion模拟器的安装及常见问题解决方法
查看>>
PHP 乘法口诀表
查看>>
如何彻底关闭windows update
查看>>
SpringMVC+SwfUpload进行多文件同时上传
查看>>
ASP.NET Core中的依赖注入(2):依赖注入(DI)
查看>>
Java_JAVA6动态编译的问题
查看>>
scala 日期格式转换
查看>>
Filtering Specific Columns with cut
查看>>
多线程编程1-NSThread
查看>>