时间复杂度

背景

今天妈妈让我写一个求出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是质数。

由此可见,我们的时间复杂度是不一样的,他的运行效率快,我运行效率比较慢。

                                大家一定要简化算法,让时间复杂度少一点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值