文章目录
程序 = 数据结构 + 算法
算法:解决问题的一种思路
数据结构:数据在计算机中存储的方式。
抽象数据类型(ADT,abstract data type):将数据类型和数据类型上的运算进行封装。
运算:增删改查,排序
算法的五大特性:
输入 :0或多个输入
输出 :至少一个输出
有穷性 :有限步后自动结束,每步都在可接受的时间内完成
确定性 :每一步都有确定的含义,无二义性
可行性 :每一步都是有穷的,即每一步都能在执行有限次后完成。
时间复杂度:
引入:由于运行平台的多样性,以程序的执行时间来衡量算法的效率不一定是客观准确的。于是以计算机执行的每一个基本操作作为衡量算法效率的时间单位。有多少基本操作就有代表会花费多少时间。
渐进函数:
n:表示输入的规模。
f(n):表示算法的具体的时间复杂度函数
g(n) : 当 n 趋于无穷时,f(n)中的低次项和最高次项的常数系数变得不再重要,只保留系数为1的最高次项,这就是g(n)
O(g(n)):算法的渐进时间复杂度,简称时间复杂度,计作T(n)
分析算法时可能需要考虑:
最优时间复杂度:算法执行最乐观的情况,基本无参考价值。
最坏时间复杂度:算法执行的一种保证,若无特别说明,时间复杂度就是指最坏时间复杂度。
平均时间复杂度:对算法的全面评价,反映算法的性质。但因为平均情况难以计算,这种衡量没有保证。
计算规则:
1.基本操作 : 计作O(1),即常数级。
2.顺序结构:按加法进行计算。
3.分支结构:取最大值。
4.循环结构:按乘法进行计算。
5.进行完上述操作,可以得出f(n),忽略低次项和常数之后得到g(n)。
6.无特殊说明时,按最坏的情况进行计算。
时间复杂度之间的关系:
O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)
Python内置性能分析模块 timeit
from timeit import Timer
使用:
实例化Timer对象,传入两个字符串:要测试的函数名字符串和函数导入命令字符串
实例调用Timer
类的timeit()
方法。传入一个参数,表示测试次数。
from timeit import Timer
def test1():
pass
t1 = Timer("test1()", "from __main__ import test1")
t1.timer(10000) #测试10000次。
list 的操作测试:
列表创建:
append():
相对最慢。
list()
:最快。
推导:[ for if]
,居中,但是操作最灵活。
列表扩展:
+:最低效,返回扩展后的结果,不是自操作,列表本身不变。
+= :自增操作符最高效
extend()
:自扩展
列表从头部插入和从尾部追加,哪个快?
append
比insert(0,)
快得多。