算法复杂度是程序猿面试中考察几率比较大的一个问题,尤其在一些互联网公司的线上笔试中,经常可以看到这种问题,时间复杂度、空间复杂度等等,而且其本身又是考察算法优劣的一个重要参考,所以在此解析说明一下,希望遇到类似问题可以不再捉急O(∩_∩)O~
首先我们应该找到程序中最基本的操作,然后考量基本运算操作的重复执行次数;如果基本运算操作重复执行的次数大,则说明算法的复杂度比较高;首先我们需要明白一个概念:一个算法中的语句执行次数称为语句频度或时间频度,记为T(n)。
常见的算法时间复杂度由小到大依次为:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n^2)<Ο(n^3)<…<Ο(2^n)<Ο(n!)
下面我们用几个实例来演示一下算法复杂度的计算是如何得出的:
1、O(1)
Temp=i; i=j; j=temp
该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶,记作T(n)=O(1)。注意:如果算法的执行时间不随着问题规模n的增加
而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。
2、O(n^2)
1. sum=0;
2. for(i=1;i<=n;i++) (n+1次)
3. for(j=1;j<=n;j++) (n^2次)
4. sum++; (n^2次)
3、O(n)
1. a=0;
2. b=1; ①
3. for (i=1;i<=n;i++) ②
4. {
5. s=a+b; ③
6. b=a; ④
7. a=s; ⑤
8. }
4、O(log2n) 以2为底
1. i=1; ①
2. while (i<=n)
3. i=i*2; ②
5、O(n^3)
1. for(i=0;i<n;i++)
2. {
3. for(j=0;j<i;j++)
4. {
5. for(k=0;k<j;k++)
6. x=x+2;
7. }
8. }
算法的复杂度其实还包括一个空间的复杂度,指的是该算法耗费的存储空间。算法的空间复杂度:一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间三个方面。