数据结构与算法 引入篇

本文探讨了算法效率的衡量方法,通过枚举法的优化实例展示了时间复杂度和大O记法的重要性。同时,通过timeit模块对比了Python中列表创建的不同方式,得出了效率排序:列表生成器>append>+>extend>insert。强调了在编程中选择高效操作对于性能的影响。
摘要由CSDN通过智能技术生成

引入问题

在这里插入图片描述

枚举法:

基本思想:挨个举例,挨个往里套。是最简单,效率最低的思想。此处运用time模块来计算程序运行的时间
import time
start_time=time.time()
for a in range(1001):
    for b in range(1001):
        for c in range(1001):
            if a+b+c==1000 and a**2+b**2==c**2:
                print("a,b,c:%d,%d,%d"%(a,b,c))
end_time=time.time()
print("枚举法times:%d"%(end_time-start_time))
print("finished")

运行结果为:在这里插入图片描述
枚举法用了102秒,可见其改进空间不小。

算法的五大特性

1.输入:算法具有0个活多个输入
2.输出:算法至少有一个或多个输出
3.有穷性:算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成
4.确定性:算法中每一步都有确定的含义,无二义性
5.可行性:算法的每一步都是可行的,也就是说每一步都能执行有限的次数完成
上例算法改进:因为a b c之间存在等式关系 因此可取消一个循环和一个条件判断。
import time
start_time=time.time()
for a in range(1001):
    for b in range(1001):
        c=1000-a-b
        if a**2+b**2==c**2:
            print("a,b,c:%d,%d,%d"%(a,b,c))
end_time=time.time()
print("改进后算法times:%d"%(end_time-start_time))
print("finished")

在这里插入图片描述
稍微对算法进行改进,其运行时间减少至1秒,比之前快了99%。
那么怎么去衡量算法的效率高低呢?

算法的效率衡量:

1.看程序运行时间,但不够客观,因为机器性能不同,运行时间也不同
2.时间复杂度与大O计法:不同的机器虽然性能不同,但代码执行的次数相同
该问题枚举法运行次数:T=1000x1000x1000x2
改进后运行次数:T=1000x1000
在判断时间复杂度时 只在数量级的层面考虑而不去计较具体运行多少次,比如枚举法中条件判断的两次可忽略不计。

python内置类型性能分析

timeit模块——用来测试一小段python程序执行速度 Timer(stmt,setup,timer)
测试列表
from timeit import Timer


def t1():
    li = []
    for i in range(10000):
        li.append(i)


def t2():
    li = []
    for i in range(10000):
        li += [i]


def t3():
    li = [i for i in range(10000)]


def t4():
    li = []
    for i in range(10000):
        li.extend([i])
def t5():
    li=[]
    for i in range(10000):
        li.insert(0,i)


timer1 = Timer("t1()", "from __main__ import t1")
print("append", timer1.timeit(1000))
timer2 = Timer("t2()", "from __main__ import t2")
print("+:", timer2.timeit(1000))
timer3 = Timer("t3()", "from __main__ import t3")
print("列表生成器", timer3.timeit(1000))
timer4 = Timer("t4()", "from __main__ import t4")
print("extend", timer4.timeit(1000))
timer5 = Timer("t5()", "from __main__ import t5")
print("insert", timer5.timeit(1000))

在这里插入图片描述

可以看出创建列表的时间效率排序为:列表生成器>append>+>extend>insert。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值