时间复杂度的计算

419 阅读2分钟

前言:       

      最开始接触时间复杂度的时候就被O(),T(n),这些数学元素符号吓到了,觉得时间复杂度一定很难学,所以就放弃了,what?why?我也不知道我当时在想什么?所以时隔多年的现在又开始从头开始啃了,终究绕不过这些坎。其实仔细静下心来还是看得懂的。

为什么要引入时间复杂度这个概念?

     官方解释:在计算机科学中,时间复杂性,又称时间复杂度算法时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。(所有字我都认识,但是意思是什么?)

     我喜欢的解释:人们都希望花最少的钱,用最短的时间办最大的事,算法也是同样的思想,最好用最少的存储空间,花最少的时间,办成同样的事就是好的算法。时间复杂度就是事前估量算法好坏的一个参考标准。(引自《大话数据结构》)

先直接做个例题:

//思考每条代码执行的次数是多少?
int num1,num2;
for(int i=0;i<n;i++){
    num1+=1;
    for(int j=1;j<=n;j*=2)
    {
       num2+=num1;
    }
}

分析:当执行int num1,num2时的频度为1; 

          语句i=0的频度为1;

          语句i<n;i++;num1+=1,j=1的频度为n;  (一共为4n)

(解释:假设i=0;i<1;只能执行一次就是i=0时的情况,所以是n次)

          语句j<=n;j*=2;num2+=num1的频度为n*logn; (一共为3n*logn)

(解释:假设n=8,第一次j=1,第二次j=2,第三次j=4,第四次j=8,所以以此类推2的m次方小于等于n,所以频度m=logn(这里log默认以2为底))

          所以算法(实际)复杂性:T(n)=2+4n+3nlogn(log默认2为底数)


简化:计算渐进复杂性

          忽略掉T(n)中的常量(2)、低次幂(4n)和最高次幂的系数(3),最终T(n)=O(nlogn)


最快的计算步骤:

  1. 找到执行次数最多的语句。
  2. 计算语句执行次数的数量级
  3. 用大O来表示结果

按照这个方法计算一次:

  1. 执行最多的语句是num2+=num1;
  2. T(n)=nlogn;
  3. T(n)=O(nlogn);

再多多找题去做一下就ok了~