算法
算法:解决问题的思路。
算法的5大特性:
1)输入:算法具有0个或多个输入;
2)输出:算法至少有1个或多个输出;
3)有穷性:算法在有限的步骤之后会自动结束而而不会无限循环,并且每一个步骤可以在可接受的时间内完成;
4)确定性:算法中的每一步都有确定的含义,不会出现二义性;
5)可行性:算法的每一步都是可行的,也就是说每一步都能够执行有限的次数完成。
算法效率衡量
一、时间复杂度
用基本运算数量来描述时间复杂度。
时间复杂度的几条基本计算规则:
1.基本操作,即只有常数项,认为其时间复杂度为O(1);
2.顺序结构,时间复杂度按加法进行计算;
3.循环结构,时间复杂度按乘法进行计算;
4.分支结构,时间复杂度取最大值,看最复杂的那个分支;
二、大O记法
时间复杂度记为T(n),去掉系数和常数,T(n)=3n²与T(n)=100n²为一个量级。
执行次数函数举例 | 阶 |
---|---|
12 | O(1) |
2n+3 | O(n) |
3n²+2n+1 | O(n²) |
总结:O(1)<O(logn)<O(n)<O(nlogn)<O(n²) <O(n³)<O(2n)<O(n!)<O(nn) |
三、最坏时间复杂度
算法完成工作最少需要多少基本操作——最优时间复杂度
算法完成工作最多需要多少基本操作——最坏时间复杂度
算法完成工作平均需要多少基本操作——平均时间复杂度
我们主要关注算法的最坏情况,亦即最坏时间复杂度
四、Python内置类型性能分析
timeit模块
timeit模块可以用来测试一小段Python代码的执行速度。
Class timeit.Timer(stmt=‘pass’,setup=‘pass’,timer=)
timeit.Timer.timeit(number=10000)
测量的是平均速度
Timer是测量小段代码执行速度的类
stmt参数是要测试的代码语句(ststment)
setup参数是运行代码时需要的设置
timer参数是一个定时器函数,与平台有关,一般用默认值就好了
#list的各个操作的速度测试
def test1():
l=[]
for i in range(1000):
l=l+[i]
def test2():
l=[]
for i in range(1000):
l.append(i)
def test3():
l=[i for i in range(1000)]
def test4():
l=list(range(1000))
def test5():
l=[]
for i in range(1000):
l.extend([i])
def test6():
l=[]
for i in range(1000):
l.insert(0,i)
from timeit import Timer
t1=Timer('test1()',"from __main__ import test1")
print('+',t1.timeit(number=100),"seconds")
t2=Timer('test2()','from __main__ import test2')
print('append',t2.timeit(number=1000),'seconds')
t3=Timer('test3()','from __main__ import test3')
print('comprehension',t3.timeit(number=100),'seconds')
t4=Timer('test4()','from __main__ import test4')
print('list range',t4.timeit(number=100),'seconds')
t5=Timer('test5()','from __main__ import test5')
print('extend',t5.timeit(number=100),'seconds')
t6=Timer('test6()','from __main__ import test6')
print('insert',t6.timeit(number=100),'seconds')
#pop操作测试
from timeit import Timer
x=list(range(2000000))
pop_zero=Timer('x.pop()','from __main__ import x')
print('pop_zero',pop_zero.timeit(number=100),'seconds')
x=list(range(2000000))
pop_end=Timer('x.pop(0)','from __main__ import x')
print('pop_end',pop_zero.timeit(number=100),'seconds')
Operation | Big-O Efficiency |
---|---|
index[ ] | O(1) |
append | O(1) |
pop() | O(1) |
pop(i) | O(n) |
insert(i,item) | O(n) |
contains(in) | O(n) |
五、数据结构
数据结构:数据对象中数据元素之间的关系
抽象数据类型:把数据类型和数据类型上的运算捆在一起,进行封装。