背景
今天妈妈让我写一个求出100以内的质数的小小小小小小小小小小小小小程序,我很快就写完了(几秒钟),但妈妈说我这个不够简洁,我心想:“我这个代码就几行,怎么不够简洁呢?”原来是因为
讨厌的时间复杂度的原因,所以她才说我的代码不简洁。
一开始我写的代码是:
a = []
for i in range(2,100+1):
for j in range(2,i):
if i % j == 0:
break
else:
a.append(i)
#不要先说我这个代码有问题,你觉得有问题的话你到python里试一下,或者在评论区提醒一下
如果给你们1分钟时间让你们写一个像我这样的小程序可能你们也会这样写(连思考都不用),
但是毕竟是双层循环,而且单层循环次数很多。
然后我想起了我做了一个测试卷,上面就有判断质数的小程序。
我们就赶紧找了一下,别看它的代码很长,它的方法很好,它时间复杂度迅速减少
他的代码是:
def getPrime(n):
for x in range(2,n+1):
x_sqrt = math.sqrt(x)
for prime in primeList:
if prime > x_sqrt:
primeList.append(x)
break
if x%prime==0:
break
else:
primeList.append(x)
return primeList
他用的是开根号比较大小。
而我又写了一段:
a = []
for i in range(2,200):
for j in a:
if i % j == 0:
break
else:
a.append(i)
是用原来的质数来除这个数,这样循环会少一些。但是我这个方法还是没有它的方法便捷。
比如:
我又写了那一段代码中range,写成range(2,30)
测试卷上写的(是一个函数),导入一下就行了,getPrime(30)
然后都print一下。
结果:
看似结果都一样,但是时间复杂度不一样,我们从37开始看,测试卷上的37只需要求下平方根(6.0827……大约就是6)质数列表(primeList)遍历到7的时候,他就会判断成37是质数(7>6)
而我写的需要到31才能判定37是质数。
由此可见,我们的时间复杂度是不一样的,他的运行效率快,我运行效率比较慢。
大家一定要简化算法,让时间复杂度少一点