复杂度分析
本文只是我的个人学习笔记,用于记录数据结构和算法的学习总结。
如何得到算法的执行效率?
-
事后统计
方式:直接在设备上运行得到结果
缺点:测试结果受测试环境和测试数据规模影响 -
复杂度分析
方式:时间复杂度分析和空间复杂度分析,直接通过代码就可以粗略的计算出算法的执行效率。通过 大 O 来表示
时间复杂度
时间复杂度
:全名是渐进时间复杂度
,标识代码执行时间随数据规模增长变化的趋势。通常我们会忽略掉公式中的常量、低阶、系数,只记录最大的量级。例如:T(n) = O(2n+2) 和 T(n) = O( 2n^2 +2n+3 )就可以记为:T(n) = O(n) 和 T(n) = O( n^2 )。
如何计算
我们在分析一个算法、一段代码的时间复杂度的时候,只关注循环次数最多那一段代码。这段核心代码执行次数的n的量级,就是整段要分析代码的时间复杂度。
需要遵循以下几点:
-
加法法则:总的时间复杂度就等于量级最大的那段代码的时间复杂度
-
乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
常见的时间复杂度量级
-
多项式量级:O(1)、O(n)、O(logn)、O(nlogn)、O(n^k )
-
非多项式量级:O( 2^n )和O(n!)
空间复杂度
空间复杂度
:渐进空间复杂度,表示算法的存储空间与数据规模之间的增长关系。常见的空间复杂度就是 O(1)、O(n)、O(n^2 )。
最好、最坏、平均、均摊时间复杂度
最好时间复杂度和最坏时间复杂度
最好时间复杂度
:在最理想的情况下,执行这段代码的时间复杂度。
最坏时间复杂度
:在最坏的情况下,执行这段代码的时间复杂度。
例如:查找一个无序数组中的元素x,如果该数组的第一个元素就是x,那么就是最好的时间复杂度。如果最后一个元素是元素x,那么就是最坏时间复杂度。
平均时间复杂度
平均时间复杂度
:全称加权平均时间复杂度或者期望时间复杂度。它的值是代码在所有情况下执行的次数的加权平均值。
均摊时间复杂度
均摊时间复杂度: 一种特殊的平均时间复杂度,一般满足下面两个条件使用:
- 代码在绝大多数情况下是低级别复杂度,只有极少数情况是高级别复杂度。
- 低级别和高级别复杂度出现具有时序规律。均摊结果一般都等于低级别复杂度。
小结
复杂度也就是渐进时间复杂度,越高阶复杂度的算法,执行效率越低。常见的复杂度从低阶到高阶有:O(1)、O(logn)、O(n)、O(nlogn)、O(n^2 )。