最近加入了个重温算法的群,60天将常用的数据结构和算法过一遍,要求每周至少打卡3次。在时间允许的情况下,每天晚上看上1到2个小时,巩固算法还是很不错的。在重温的同时,我将笔记整理到到此。
打卡Day1:今天学复习了“复杂度分析上”,整理如下:
决定算法快慢的因素有很多,但是所有的因素可以分为两类。第一类是不随数据量变化的因素,第二类是随着数量变化的。
数据结构和算法的目的是减少资源占用和响应时间,提高执行效率。
因此,需要有统计资源占用和响应时间的考量指标。于是,空间复杂度和时间复杂度就诞生了。
时间复杂度
T(n)=O(f(n))
1.执行时间 T(n) 与每行代码的执行次数 n 成正比;
2.n 表示数据规模的大小;
3.f(n) 表示每行代码执行的次数总和;
4.O表示代码的执行时间 T(n) 与 f(n) 表达式成正比
分析方法:
1. 只关注循环执行次数最多的一段代码
2. 加法法则:总复杂度等于量级最大的那段代码的复杂度。示例:
如果 T1(n)=O(f(n)),T2(n)=O(g(n));
那么 T(n)=T1(n)+T2(n)=max(O(f(n)), O(g(n))) =O(max(f(n), g(n))).
3. 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积。示例:
T(n) = T1(n) * T2(n) = O(n*n) = O(n2)
空间复杂度分析
表示算法的存储空间与数据规模之间的增长关系
数据结构和算法的复杂度都跑不出这几个
O(logn):
O(n):最常见的一维数组遍历,链表遍历
O(nlogn):归并,快排
O(n2):冒泡,插入
学习复杂度不是浪费时间:不懂复杂度分析的性能测试都是碰运气,性能好的原因是什么,不好的原因又是什么,还是要回到复杂度分析上。