一. 算法的引入
算法其实就是解决问题的独立方法和思想
五大特性
- 输入: 可以0或者多个输入
- 输出: 至少一个或者多个输出
- 有穷性: 就是有限循环,不是无限循环
- 确定性: 就是唯一的,没有异议的
- 可行性: 代码每一行都可以执行
二. 算法效率衡量
我们知道仅仅靠时间来衡量效率是不对的, 因为代码所在的测试环境不一样, 比如i3 与i9的第机器执行同一个代码, 时间很明显不一样,还有受到数据规模的影响, 所以说,靠时间我们是无法确定代码效率的高低 , 所以我们有大O 复杂度表示法
第二次
大O表示法
通过这段代码执行时间的推导过程,我们可以得到一个非常重要的规律,那就是,所有代码的执行时间 T(n) 与每
行代码的执行次数 n 成正比。
T(n) = Of(n)
T(n) 表示执行代码的时间
f(n) 表示每行代码执行的次数
n 表示数据规模的大小
O表示正比
其实T(n)也不是真正的执行时间. 而是一种趋势而已
三. 时间复杂度分析
- 只关注循环次数最多的那段代码
def cal(n):
sum = 0
i = 1 #两个常量就是O(1)
for i in rang(n+1): #这个是O(n)
sum += i
i+=1
return sum
其中第 2、3 行代码都是常量级的执行时间,与 n 的大小无关,所以对于复杂度并没有影响。循环执行次数最多的是第 4、5 行代码,所以这块代码要重点分析, 这两行代码被执行了 n 次,所以总的时间复杂度就是 O(n)。
2. 加法法则: 总时间复杂度等于 时间复杂度最大的那段代码
def cal(n):
sum = 0
i = 1
for in range(100): #这里与n无关 , 所以是O(1)
sum += i
for i in rang(n+1):
sum += i
i+=1
for j in range(n+1):
pass
综合这三段代码的时间复杂度,我们取其中最大的量级。所以,整段代码的时间复杂度就为 O(n^2)。也就是说:总的时间复杂度就等于量级最大的那段代码的时间复杂度
四. 常见时间复杂度
常见的复杂度并不多,从低阶到高阶有:O(1)、O(logn)、O(n)、O(nlogn)、O(n2)。
执行次数函数举例 阶 非正式术语
四. python内置的类型性能分析
timeit模块
- timeit模块可以用来测试一小段Python代码的执行速度
- class timeit.Timer(stmt=‘pass’, setup=‘pass’, timer=)
- Timer是测量小段代码执行速度的类。
- stmt参数是要测试的代码语句(statment);
- setup参数是运行代码时需要的设置;
- timer参数是一个定时器函数,与平台有关
- timeit.Timer.timeit(number=1000000)
- Timer类中测试语句执行速度的对象方法。number参数是测试代码时的测试次数,默认为1000000次。方法返回执行代码的平均耗时,一个float类型的秒数。
五. 数据结构
- 算法与数据结构的区别
- 数据结构只是静态的描述了数据元素之间的关系。
- 高效的程序需要在数据结构的基础上设计和选择算法。
- 程序 = 数据结构 + 算法
- 总结:算法是为了解决实际问题而设计的,数据结构是算法需要处理的问题载体