1、如何考虑代码运行更快、更省存储空间,执行效率是算法一个重要指标。
2、算法分析:时间、空间
3、为什么需要复杂度分析呢?考虑到我们可以把代码跑一遍,通过统计,监控就能得到算法的执行时间和占用内存大小。
3-1)这种方式可以评估效率,可以称呼为事后统计法。
3-2)测试结果依赖测试环境,例如:机器、浏览器、硬件设备
3-3)测试结构根据数据量受限
4、大0复杂度表示法(渐进时间复杂度,简称:时间复杂度),大0时间复杂度并不具体表示代码真正执行时间,而是表示代码执行时间随数据规模而增长趋势。
案例如下: int cal(int n){ int sum = 0; int i=1; for(;i<=n;++i){ sum = sum +i; } return sum; }
代码执行时间T(n)与每行代码的执行次数n成正比。
案例分析:
1)3、4行代码都是常量级执行时间,与n的大小无关,所以对复杂度没有影响
2)5、6行代码执行n次
3)结果:总时间复杂度就是 0(n)
公式:
T(n) : 代码执行时间
n :数据规模的大小
f(n):每行代码执行次数的总和
0:代码执行时间 与 代码执行次数总和 成正比
分析:
1、只关注循环执行次数最多的一行代码,核心代码 执行次数n的量级,也就是整段代码的时间复杂度。
2、大0复杂度方法只是一种变化趋势
3、通常会忽略公式中的常量、低阶、系数,记录最大级量级
4、加法法则:总复杂度等于量级最大的那段代码的复杂度。
案例2:
sum_1:
1)代码循环1000次、10000次 ,只要是已知数,跟n无关,也是常量级执行时间,尽管有影响,从时间复杂度概念中讲,本身对数据增长趋势并没有影响。
sum_2:
1)0(n)
sum_3:
1)0(n的2平方)
--------
常见时间复杂度
1)0(1)只是常量级中的一个表示方法,而不是执行代码行数。
2)算法中不存在递归、循环,哪怕有成千上万的代码,时间复杂度都是0(1)
时间复杂度:0(log3n)
问题遗留:什么是对数阶???
0(nlogn) 算法时间复杂度,归并排序、快速排序,时间复杂度都是O(nlogn)