一、算法引入 例子:如果a+b+c=1000,且a^2+b^2=c^2(abc是自然数),如何求出abc可能组合 思路一:挨个试枚举法 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("time:%d"%(end_time-start_time)) T=1000*1000*1000*2 T(n)=n^3*2 渐进函数g(n)=n^3 124秒 思路二:c=1000-a-b import time start_time=time.time() for a in range(0,1001): for b in range(0,1001): c=1000-a-b 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("time:%d"%(end_time-start_time)) T(n)=n*n*2 g(n)=n^2 1秒 二、时间复杂度通常指最坏时间复杂度 基本操作,即只有常数项,认为其时间复杂度为O(1) 顺序结构,时间复杂度按照加法计算 循环结构,时间复杂度安照乘法计算 分支结构,时间复杂度取分支的最大值 常见时间复杂度的关系: O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n) 三、代码执行时间测量模块 from timeit import Timer def t1(): l=[] for i in range(10000): l=l+[i] def t2(): l=[] for i in range(10000): l+=[i] def t3(): l=[i for i in range(10000)] def t4(): l=list(range(10000)) timer1=Timer("t1()","from __main__ import t1")#(‘测算的语句’,‘当前导入的模块’) print("+:",timer1.timeit(1000))#测算1000c次 timer2=Timer("t2()","from __main__ import t2") print("+:",timer2.timeit(1000))#测算1000c次 timer3=Timer("t3()","from __main__ import t3") print("+:",timer3.timeit(1000))#测算1000c次 timer4=Timer("t4()","from __main__ import t4") print("+:",timer4.timeit(1000))#测算1000c次 四、list内置操作的时间复杂度 index[] O(1) append O(1) pop() O(1) insert() O(n) del() O(n) iteration O(n) contains(in) O(n) reverse O(n) sort O(nlogn) 五、字典内置操作时间复杂度 copy O(n) get item O(1) delete item O(1) contains(in) O(1) iteration O(1) 总结: 程序=数据结构+算法 算法是为了解决实际问题而设计的,数据结构是算法需要处理的问题载体