数据结构与算法-时间复杂度与空间复杂度

今天开始学习王争老师的数据结构与算法。

一、时间复杂度

1、时间复杂度由来

数据结构与算法-时间复杂度与空间复杂度_第1张图片

1.1、上面代码段中,第2,3行执行分别需要1个unit_time的执行时间,第4,5执行分别需要n个unit_time的执行时间,所以这段代码总的执行时间为T(n)=(2+2n)*unit_time。

数据结构与算法-时间复杂度与空间复杂度_第2张图片

1.2、上面的代码中,第2,3,4分别需要1个unit_time的执行时间,第5,6行分别需要n个unit_time的执行时间,第7,8行分别需要n²个unit_time的执行时间,所有这段代码总的执行时间为T(n)=(3+2n+2n²)*unit_time。

由以上两个可总结出执行时间大O的公式T(n)=O(f(n)),由于当N很大时,公式中的低阶、常量、系数三部分并不左右增长趋势,所以都可以忽略,因此1.1和1.2中T(n)=O(n),T(n)=O(n²),这就是时间复杂度的公式。

2、时间复杂度分析

2.1 只关注循环执行次数最多的一段代码

2.2 加法法则:总复杂度等于量级最大的那段代码的复杂度

2.3 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

3、几种常见时间复杂度实例分析

可以粗略的分为多项式量级和非多项式量级

非多项式量级:O(2ⁿ)和O(n!)

多项式量级:O(1)

非多项式量级的算法问题叫做NP(Non-DeterministicPolynomial,非确定多项式)问题,当n很大时,执行时间会急剧增加。

3.1 多项式量级

1、O(logn)、O(nlog(n))

数据结构与算法-时间复杂度与空间复杂度_第3张图片

如上,要求执行时间,那么只要知道while循环里面执行了多少次即可,那么i是变化的,假设执行x次之后退出循环,即2的x次方=n,所以x=log₂N,也就是说这段代码的执行时间为O(n)=O(log(n)),根据乘法法则,如果while外层再套一个for循环,那么O(n)=O(nlogn)

2、O(m+n),O(m*n)

数据结构与算法-时间复杂度与空间复杂度_第4张图片

如上图代码,如果代码的复杂度由两个数据的规模决定,那么无法事先评估m和n谁的量级大,那么就不能使用加法法则忽略一个,这里就需要统计两个的量级O(n)=O(f(m)+f(n)),但是乘法法则依然有效,即O(n)=O(f(m)+f(n))

二、空间复杂度

常见的有O(1),O(n),O(n²),像O(logn)和O(nlogn)不常用

数据结构与算法-时间复杂度与空间复杂度_第5张图片

如上图代码中,第2行是常量阶,可以忽略,第3行中申请了大小为n的空间,所以整段代码的空间复杂度为O(n)

补充:

最好情况时间复杂度,最快情况时间复杂度,平均情况时间复杂度,均摊时间复杂度。

其中平均情况时间复杂度和均摊时间复杂度看得比较懵。

个人理解,以下代码为例

数据结构与算法-时间复杂度与空间复杂度_第6张图片

平均时间复杂度:第一种思路:add方法有两种情况,第一种是数组没满,这时候每次进来都是O(1),如果数组满了,那么进来就是O(n),所以O(1)的情况有n个,O(n)的情况有1个,总共进来了n+1次,那么由每次进来的概率计算公式可得O(n)=(1+1...+1+n)/(n+1),其中加了n个1,所以O(n)=2n/(n+1),也即O(n)=O(1)。

第二种思路:使用加权平均值,由于存在两种情况,假设两种情况的概率都为1/2,第一种情况的每个概率都是1/n。所以总的O(n)=1*1/2n+1*1/2n+...+1*1/2n+n*1/2n=O(1)。

均摊算法时间复杂度,前n次操作都是O(1),第n+1次操作是O(n),那么将最大的一次时间复杂度分摊到前面的n次中,可得每次操作的时间复杂度为O(1)。

讲真,模模糊糊的,似懂非懂,还是挺懵的,以后再慢慢消化,希望能慢慢理解。

你可能感兴趣的:(数据结构与算法,时间复杂度,空间复杂度,大O表示法)