一、复杂度分析(上)

1、大 O 复杂度表示法

算法的执行效率,粗略地讲,就是算法代码执行的时间。但是,如何在不运行代码的情况下,用“肉眼”得到一段代码的执行。以下举两个例子:

(1)

如果每执行一句话,消耗一个unit_time,该代码执行了(2n+2)*unit_time。

所有代码的执行时间 T(n) 与每行代码的执行次数成正比。T(n) = (2n+2)

综上分析,该段代码的时间为  T(n) = (2n^2+2n+3)*unit_time

以上的规律可以汇总为一条公式

大O就是时间复杂度表示法,该表示法表示的并不是真正的执行时间,而是表示

代码执行时间随数据规模增长的变化趋势,所以,也叫作渐进时间复杂度,简称时间复杂度。

2、时间复杂度分析

如何分析一段代码的时间复杂度呢?按照以下三个比较实用的方法。

(1)只关注循环执行次数最多的一段代码。

    由于大O这种复杂度表示方法知识表示一种变化趋势,所以我们可以忽略掉常数、低阶、系数,只记录一个最大阶的量级就可以了。

该复杂度为:O(n)

(2)加法法则:总复杂度等于量级最大的那段代码的复杂度。

这里要注意几点:首先,时间复杂度与常数循环没有关系,无论是100次还是10000次都可以忽略。由于时间复杂度表示的是一个时间的趋势,所以无论常量循环多少次,时间复杂度都是不变的。

      然后,总复杂度等于量级最大的那段代码的复杂度。所以是:O(n^2)。

(3)乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积。

T(n) = T1(n) * T2(n) = O(n*n)  = O(n^2)

以下有几种常见的时间复杂度实例分析

可以粗略的分为两类:多项式量级  和  非多项式量级, 非多项式只有两个:O(2^n) 和 O(n!)

简单的不解释了,

(1)O(logn)、O(nlogn)

根据上例可以看出,是下面的公式:

通过 2^x=n 求解 x,x = 

  在时间复杂度的表示方法里,统一以10为底,统一表示为O(logn).

  O(nlogn)根据乘法法则可推导,是O(logn)的在外层加入O(n)的循环嵌套

(2)O(m+n)

3、空间复杂度分析

时间复杂度的全称为渐进时间复杂度,表示算法的执行时间与数据规模之间的增长关系。

渐进空间复杂度,表示算法的存储空间与数据规模之间的增长关系。

该段代码的空间复杂度为O(n)

总结:

从低阶到高阶有:O(1)、O(logn)、O(n)、O(nlogn)、O(n^2 )。

猜你喜欢

转载自blog.csdn.net/qq_28090573/article/details/85227592