算法分析 - 时间复杂度分析

在计算核心操作次数的时候,随着输入规模的增大,我们可以设定以下规则:

  • 算法函数中的常熟可以忽略;
  • 算法函数中的最高次幂的常数因子可以忽略;
  • 算法函数中最高次幂越小,算法效率越高。

我们分析一个算法的运行时间,最重要的就是把核心操作的次数和输入规模关联起来。可以结合如下图进行理解:

一、算法的时间复杂度

在进行算法分析时,我们一般明确:执行次数 = 执行时间。用大写的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. 在网上做笔试,前几个测试用例都通过了,突然一个巨大无比的数据量来了,结果代码报错,如此大的数据量完全看不出问题出在哪.

 

posted @ 2020-05-05 22:36  灰色飘零  阅读(462)  评论(0)    收藏  举报