最通俗易懂的------------时间复杂度

一、时间复杂度

  1. 是什么
    表示执行个算法所需要的计算工作量
  2. 用什么表示与官方定义
    渐进时间复杂度(大O表示法):若存在函数 f(n),使得当n趋近于 无穷大时,T(n)/ f(n)的极限值为不等于零的常数,则称 f(n)是T(n)的同数量级函数。记作 T(n)= O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
    PS:看的头疼代表你还是个正常人,记住红色字体内容,然后跟着下面例子走就行了。
  3. 四个通俗易懂的例子
     
  1. 吃的例子:N个香蕉2天吃一个,吃完需要几天?
    void eat1(int n){
      for(int i=0; i<n; i++){;
        System.out.println("等待一天");    //n次
        System.out.println("吃一个香蕉");  //n次
      }
    }

执行次数:T(n)=2n

 


void eat2(int n){

 for(int i=1; i<n; i*=2){

    System.out.println("等待一天");    //2^x≈n  -->x≈log2^n

    System.out.println("等待一天");    //x≈log2^n

    System.out.println("等待一天");    //x≈log2^n

    System.out.println("吃一半香蕉");  //x≈log2^n

  }

}

执行次数:T(n)=4*log2^n

  1. 吃的例子:N个香蕉,1个柚子,两天吃掉一个柚子,吃完柚子需要几天?
    void eat3(int n){
      System.out.println("等待一天");    //1
      System.out.println("吃一个柚子");  //1
    }

执行次数:T(n)=2

  1. 吃的例子:N个柚子,吃掉第一个柚子需要1天,第二个需要2天,一次类推,吃完需要几天?
    void eat4(int n){
      for(int i=0; i<n; i++){
        for(int j=0; j<i; j++){
          System.out.println("等待一天"); //1+2+3+4+...+n-1
        }
        System.out.println("吃一个柚子"); //n
      }
    }

执行次数:T(n)= 1+2+3+......+ n-1 + n = (1+n)*n/2 = 0.5n^2 + 0.5n

       4.如何推导出时间复杂度

             ①.如果运行时间实常数级,用常数1表示

             ②.只保留时间函数中的最高阶项

             ③.如果最高阶项存在,则省去最高阶项前面的系数

      5.上四个例子的时间复杂度为

              ①T(n)=2n  最高阶项为2n,省去系数2,转化的时间复杂度为:T(n) = O(n)
                 图解:

               

             ②T(n)=4*log2^n   最高阶项为4*log2^n,省去系数4,转化的时间复杂度为:T(n) = O(log2^n)
                 图解:
                

             ③T(n)=2    只有常数量级,转化的时间复杂度为:T(n) = O(1)

                 图解:

                

             ④T(n) = 0.5n^2 + 0.5n      最高阶项为0.5n^2,省去系数0.5,转化的时间复杂度为T(n) = O(n^2)

                 图解:

                

总:由上可以得出根据N值的不同,算法的时间复杂度在不同的N值区间内会有区别,所以根据不同的情况设计不同的算法是非常必要的。

 

 

版权声明:本博客为记录本人自学感悟,内容大多从网上学习与整理所得,若侵权请告知!

https://me.csdn.net/qq_39657909

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页