数据结构与算法Day02----时间、空间复杂度分析方法

一、时间复杂度:

1、定义(大O复杂度表示法):表示代码执行时间随数据规模增长的变化趋势,而不是具体表示代码真正的执行时间,也叫做渐进时间复杂度,简称时间复杂度。一般只记录一个最大阶的量级。

2、分析方法:在分析一段代码的时间复杂度时,一般只关注执行次数最多的那一段代码。这段核心代码的执行次数的n的量级,就是整段要分析代码的时间复杂度。

二、时间复杂度的分析方法:

1)单段代码看高频:比如循环。

2)多段代码取最大:比如一段代码中有单循环和多重循环,那么取多重循环的复杂度。

3)嵌套代码求乘积:比如递归、多重循环等。乘法法则:如果T1(n)=O(f(n)), T2(n)=O(g(n));那么T(n)=T1(n)*T2(n)=O(f(n))*O(g(n))=O(f(n)*g(n))。

4)多个规模求加法:比如方法有两个参数控制两个循环的次数,那么这时就取二者复杂度相加。加法法则:如果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)))。

三、常见的几种时间复杂度:

常数阶(O(1)):代码的执行时间不随n的增长而增大;一般情况下,只要算法中不存在循环、递归语句,一般时间复杂度都是O(1)。

对数阶(O(logn)、O(nlogn)):对数之间是可以互相转换的, log3n就等于log以32 * log2n,所以O(log3n) = O(C * log2n),其中C=log32是一个常量。基于我们前面的一个理论: 在采用大O标记复杂度的时候,可以忽略系数,即O(Cf(n)) = O(f(n))。所以, O(log2n) 就等于O(log3n)。因此,在对数阶时间复杂度的表示方法里,我们忽略对数的“底”,统一表示为O(logn)。

O(m+n)、 O(m*n):m和n是表示两个数据规模。我们无法事先评估m和n谁的量级大,所以我们在表示复杂度的时候,就不能简单地利用加法法则,省略掉其中一个。所以,上面代码的时间复杂度就是O(m+n)。针对这种情况,原来的加法法则就不正确了,我们需要将加法规则改为:T1(m) + T2(n) = O(f(m) + g(n))。但是乘法法则继续有效: T1(m)*T2(n) = O(f(m) * f(n))。

二、空间复杂度:

1、定义:空间复杂度全称是渐进空间复杂度(asymptotic space complexity), 表示算法的存储空间与数据规模之间的增长关系。

你可能感兴趣的:(数据结构与算法Day02----时间、空间复杂度分析方法)