算法效率衡量:时间复杂度————程序总共要执行的基本运算步骤的总和。
对于本题的枚举法,a+b+c= 1000时,时间复杂度(基本运算步骤)为T = 1000 * 1000 * 1000 * 2 即为 T(n) = n**3 * 2
大O表示法:对于一个时间复杂度表达式,只留下与n最相关的,最特征部分,能够特征和趋势即可。T(n)==>g(n) = n**3 (g(n)为时间复杂度的大O表示法)
时间复杂度的几条基本计算规则:
1.基本操作,即只有常数项,认为其时间复杂度为O(1)
2.顺序结构,时间复杂度按加法进行计算
3.循环结构,时间复杂度按乘法进行计算
4.分支结构,时间复杂度取最大值
5.判断一个算法的效率时,往往只需关注操作数量的最高次项,其他次要项和常数项可以忽略
6.在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度
常见的时间复杂度大小关系:
O(1) < O(logn) < O(n) < O(nlogn) < O(n² ) < O(n³) < O(2^n) < O(n!) < O(n ^n
例:枚举法
import time
start_time = time.time()
for a in range(0,1001):
for b in range(0, 1001):
for c in range(0, 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('finish')
print('用时:%d' %(end_time - start_time))
程序用时108s
对于本题的枚举法,a+b+c= 1000时,时间复杂度(基本运算步骤)为T = 1000 * 1000 * 1000 * 2 即为 T(n) = n**3 * 2
时间复杂度为T(n) = O(n^3)
对枚举法进行改进后(通过a,b,c的关系减少对c的枚举),操作数量减少,程序用时随之减少:
import time
start_time = time.time()
for a in range(0,1001):
for b in range(0, 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('finish')
print('用时:%d' %(end_time - start_time))
程序用时1s
timeit模块
timeit模块可以用来测试一小段python代码的执行速度。
#使用timeit模块测试几种列表生成方法所需时间
import timeit
from timeit import Timer
def t1():
li = []
for i in range(10000):
li += [i]
def t2():
li = []
for i in range(10000):
li.append(i)#把元素添加到列表尾部
def t3():
li = [i for i in range(10000)]
def t4():
li = list(range(100000))
def t5():
li = []
for i in range(10000):
li.extend([i])
def t6():
li = []
for i in range(10000):
li.insert(0,i)#(0,)代表每个元素都添加到列表首部
timer1 = Timer('t1()','from __main__ import t1')
print('t1:',timer1.timeit(1000)) #测试1000次
timer2 = Timer('t2()','from __main__ import t2')
print('t2:',timer2.timeit(1000)) #测试1000次
timer3 = Timer('t3()','from __main__ import t3')
print('t3:',timer3.timeit(1000)) #测试1000次
timer4 = Timer('t4()','from __main__ import t4')
print('t4:',timer4.timeit(1000)) #测试1000次
timer5 = Timer('t5()','from __main__ import t5')
print('t5:',timer5.timeit(1000)) #测试1000次
timer6 = Timer('t6()','from __main__ import t6')
print('t6:',timer6.timeit(1000)) #测试1000次
结果如下图,可以看出每种方法的效率不一样,在具体任务中可考虑使用。
数据结构引入歧途——数据的组织方式。
数据结构只是静态的描述了数据元素之间的关系。
高效的程序需要在数据结构的基础上设计和选择算法。
程序 = 数据机构 + 算法
总结:算法是为了解决实际问题而设计的,数据结构是算法需要处理的问题载体。
抽象数据类型概念:把原有的基本数据和这个数据所支持的基本操作放在一起,形成一个整体。
最常用的5种数据运算:插入、删除、修改、查找、排序。