算法分析 - 时间复杂度分析
在计算核心操作次数的时候,随着输入规模的增大,我们可以设定以下规则:
- 算法函数中的常熟可以忽略;
- 算法函数中的最高次幂的常数因子可以忽略;
- 算法函数中最高次幂越小,算法效率越高。
我们分析一个算法的运行时间,最重要的就是把核心操作的次数和输入规模关联起来。可以结合如下图进行理解:

一、算法的时间复杂度
在进行算法分析时,我们一般明确:执行次数 = 执行时间。用大写的O()来体现算法时间复杂度的记法,我们称之为大O记法。一般情况下,随着输入规模的增大,T(n)增长最慢的算法为最优算法。
常见的大O阶有:线性阶O(n)、平方阶O(n^2)、立方阶O(n^3)、对数阶O(logn)、常数阶O(1)。
下面是对常见时间复杂度的一个总结表:

二、理解时间复杂度(练习一)
题目:一个有序数组A,另一个无序数组B,请打印B中的所有不在A中的数,A数组长度为N,B数组长度为M。
算法流程1:对于数组B中的每一个数,都在A中通过遍历的方式找一下;
算法流程2:对于数组B中的每一个数,都在A中通过二分的方式找一下;
算法流程3:先把数组B排序,然后用类似外排的方式打印不在A中出现的数;
复杂度分析
流程1 : 遍历B[0,M-1],遍历A[0,N-1],故时间复杂度为O(M*N).
流程2 :二分法寻址,N一次一半,复杂度为logN(以2为底),B中所有元素遍历一遍需要M次,则O(M*logN)
流程3:B排序的时间复杂度取决于选择的排序算法,例如:选择冒泡排序的话,则为 O(M^2) + O(N+M)
三、如何测试正确性未知但时间复杂度相对优秀的算法的正确性
可以考虑使用对数器。
如何使用对数器:
1. 首先需要有一个你想要测的方法a;
2. 实现一个绝对正确但是复杂度不好的方法b;
3. 实现一个随机样本产生器;
4. 实现对比算法a和b的方法;
5. 把方法a和方法b比对多次来验证方法a是否正确;
6. 如果有一个样本使得比对出错,打印样本分析是哪个方法出错;
7. 当样本数量很多时比对测试依然正确,可以确定方法a已经正确。
对数器应用场景:
1. 交流算法题的时候,感觉自己会做,同样找不到在线测试的时候.
2. 在网上做笔试,前几个测试用例都通过了,突然一个巨大无比的数据量来了,结果代码报错,如此大的数据量完全看不出问题出在哪.

浙公网安备 33010602011771号