复杂度分析是什么
代码的复杂度分为时间复杂度与空间复杂度。
数据结构与算法解决的核心问题就是让代码更“快”、更“省”。具体来说,就是执行的时间尽可能的短,占用的空间尽可能的少。
而代码到底有多“快”、有多“省”,需要对应的衡量标准,时间复杂度就作为代码有多“快”的衡量标准,空间复杂度就作为有多“省”的衡量标准。
对时间复杂度与空间复杂度的计算分析就是复杂度分析了。
为什么需要复杂度分析
我记得我刚接触到时间复杂度这个概念时就有这个疑问:明明可以让代码跑一下来看下它具体的执行时间,以此作为它的时间复杂度不好吗?毕竟这样的跑出来的结果是最为真实的。
这样来作为一段代码的具体执行时间也是可以的,不过不够精确,有很大的局限性。
首先这种直接跑出来的时间非常依赖测试环境,很显然,高端CPU跑一段代码的时间一定是少于普通CPU的。另外,测试结果会受数据规模的影响,在数据量不同的情况下,测试出代码执行的时间一定也是不同的,数据量小的情况下是很难测出一个算法的性能的。
鉴于此,需要从代码本身来分析它的复杂度。从而判断一个算法在时间、空间上的优劣。
时间复杂度分析中的代码执行时间
我们先来看一下如何判断一段代码的执行时间。
int cal(int n) {
int sum = 0;
int i = 1;
int j = 1;
for (; i <= n; ++i) {
j = 1;
for (; j <= n; ++j) {
sum = sum + i * j;
}
}
}
要去除掉环境因素来看一段代码的执行时间,那么首先我们会想到的一定是看一条条语句的执行次数,假定一条语句的执行时间为ttt,那么代码运行的总时间就是n∗tn*tn∗t,nnn是语句的数量。
当然,这样的方式并不精确,因为一条语句执行的时间我们并不能精确的估计出,且每条语句的执行时间也不相同。
不过,这种分析法的核心就在于抓住次数这一主要矛盾,忽略每条语句所受环境影响造成的执行时间不同的这一次要矛盾。
接着看上述代码:
第2、3、4条语句各执行一次,第5、6条语句各执行nnn次,第7和第8条语句各执行n2n^2n2次。所以,总的语句执行次数为(2n2+2n+3)(2n^2+2n+3)(2n2+2