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 )。