计算机基础知识
一、为什么需要复杂度分析?
事后统计法 把代码跑一遍,通过统计、监控来得到算法执行的时间和占用的内存大小。其局限性表现在:
- 测试结果非常依赖测试环境;
- 测试结果受数据规模的影响很大。
需要一个不用具体的测试数据来测试就可以粗略估计算法的执行效率的方法 —— 大 O 复杂度表示法。
二、大 O 复杂度表示法
算法的执行效率,粗略讲就是算法代码执行的时间。
所有代码的执行时间 T(n) 与每行代码的执行次数成正比。公式如图表示:
T(n)表示代码执行的时间;n表示数据规模的大小;f(n)表示每行代码执行的次数总和,是一个公式(表达式);O表示代码的执行时间T(n)与f(n)表达式成正比。
大 O 时间复杂度 实际上并不具体表示代码真正的执行时间,而是代码执行时间随数据规模增长的变化趋势。即:渐进时间复杂度,简称时间复杂度。
公式中的 低阶、常量、系数 三部分并不左右增长趋势,都可以忽略。
三、时间复杂度分析
- 只关注循环执行次数最多的一段代码。
- 加法法则:总复杂度等于量级最大的那段代码的复杂度。
- 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积。
四、几种常见的时间复杂度实例
常量级:只要代码的执行时间不随
n的增大而增大,就可以记作O(1)。一般情况下,只要算法中不存在循环语句、递归语句,即使有成千上万行的代码,其时间复杂度都是O(1)。
五、空间复杂度分析
- 渐进时间复杂度:表示算法的执行时间与数据规模之间的增长关系。
- 渐进空间复杂度:表示算法的存储空间与数据规模之间的增长关系。
我们常见的空间复杂度就是 O(1)、O(n)、O(n²) 。
六、复杂度分析
复杂度也叫渐进复杂度,包括时间复杂度和空间复杂度,用来分析算法执行效率与数据规模之间的增长关系。
越高阶复杂度的算法,执行效率越低。
从低阶到高阶有:O(1)、O(logn)、O(n)、O(nlogn)、O(n²) 。
七、复杂度分析方面的其他概念
同一段代码,在不同输入的情况下,复杂度量级有可能是不一样的。引入以下概念可以更加全面地表示一段代码的执行效率。
- 最好情况时间复杂度:在最理想的情况下,执行这段代码的时间复杂度。
- 最坏情况时间复杂度:在最糟糕的情况下,执行这段代码的时间复杂度。
- 平均情况时间复杂度:加权平均时间复杂度或期望时间复杂度。
- 均摊时间复杂度:摊还分析法。
一种特殊的平均时间复杂度。 对一个数据结构进行一组连续操作中,大部分情况下时间复杂度都很低,只有个别情况下时间复杂度比较高,而且这些操作之间存在前后连贯的时序关系,这个时候可以将这一组操作放在一块儿分析,看是否能将较高时间复杂度那次操作的耗时,平摊到其他那些时间复杂度比较低的操作上。而且,在能够应用均摊时间复杂度分析的场合,一般均摊时间复杂度就等于最好情况时间复杂度。