时间复杂度介绍

一、度量一个程序(算法)执行时间的两种方法:

(1)事后统计法:将程序运行的时间记录下来进行统计和分析就是事后统计法。但是这种方法不太科学,原因有如下两点:

  • 如果该程序执行所需时间非常慢(半个小时才能执行完毕),那么我们每次测试可能都需要等待这么久。
  • 运行时间依赖于计算机硬件、软件等环境因素,这种方法需要在相同的计算机环境下运行才可以判断。

(2)事前估算法:通过分析估算某个算法的时间复杂度来判断哪个算法更优。 但是在介绍时间复杂度之前我们首先需要了解什么是时间频度。

二、时间频度:

基本介绍:一个算法花费的时间与算法中语句的执行次数成正比。哪个算法中语句执行次数愈多,他花费的时间也就越多。一个算法中语句的执行次数成为时间频度。记为 T(n).

举个例子:规定返回一个从start一直加到end之和。

public static int sum(int start,int end){  
  int result = 0;   
 for (int i = start; i <= end ; i++) {      
  result += i;  
  }  
  return result;
}

T(n) = n+1; (要加1是因为最后一次循环仍要执行一次判断)

public static int sum2(int start,int end){ 
   return (start+end)*end/2;
}

T(n) = 1; (等差数列求和公式)

对于时间频度我们需要注意一下几点:

2.1常数项可忽略:

例如:T(n) = 2*n+100 ,T(n) =2n+50
n = 1 时 : 102 , 52
n = 2 时 : 104 , 54
n = 3 时 : 106 , 56
n=10000 时 : 20100 , 20050
从上面例子可以看出 当n趋近于无穷时,常数可忽略。

2.2低次项可忽略:

例如:T(n) = 2*n^2+3n+10 ,T(n) =2n^2
n = 1 时 : 15 , 2
n = 2 时 : 24 , 8
n=100 时 : 20310 , 20000

2.3系数可忽略:

例如:T(n) = 3*n^2+2n ,T(n) =5n^2+7n
n = 1 时 : 5 , 12
n = 2 时 : 16 , 34
n=100 时 : 30200 , 50700

有兴趣的可以把曲线图画一下,可以更直观的看出区别。

三、时间复杂度

定义:一般情况下,算法中的基本操作语句的执行次数时问题规模n的某个函数,用T(n)表示。若存在某个函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于0的常数,则称f(n)是T(n)的同数量级函数(类似高等数学中的同阶无穷小),记作T(n) = O(f(n))。称O(f(n))为算法的渐进时间复杂度,简称时间复杂度。

看了上面一堆你可能已经蒙圈了。没关系,只要你现在能懂时间频度就可以看懂这个例子:

我们现在根据一个时间频度来试着推算一下时间复杂度:如:T(n) = 2n^2+7n+2 假设存在f(n) = n^2 ,那么当n趋近于无穷大时 T(n)/f(n) = lim n->正无穷 T(n)/f(n) = 2 ,等于一个常数 。 (洛必达法则),现在就可以说该算法的时间复杂度为 O(n^2)。所以我们现在只需要弄清楚f(n)怎么求不就大功告成了吗?好的,重点来了。

重点如何计算f(n):

  • 用常数1代替时间频度表达式中的所有加法常数
  • 修改后的时间频度表达式中,只保留最高阶项
  • 去除最高阶项的系数

注意:T(n)不同的算法,时间复杂可能相同:如: T(n) = n^3+2n+1 与 T(n) = 2n^3+7

三、常见的几种时间复杂度

常数阶O(1)
对数阶O(log2n) (以2为底n的对数)
线性阶O(n)
线性对数阶O(nlog2n)
平方阶O(n^2)
立方阶O(n^3)
k次方阶O(n^k)
指数阶O(2^n)

常见的算法时间复杂度从小到大依次为:O(1) < O(log2n) < O(n) < O(nlog2n) < O(n^2) < O(n^3) < O(n^k) < (2^n)。时间复杂度不断增大,算法执行效率越低。

3.1常数阶O(1)

无论代码执行多少行,只要没有循环结构那么它的时间复杂度为O(1);

public static void consystant(int n){
   int i=1;
   n = i++;
}

可以看出不管n是2或者是10000执行的时间频度仍然是那固定的两行代码。

3.2对数阶O(log2n)
public static void log(int n){
    int i = 1;
    while(i<n){
        i=i*2;
    }
}
当while循环体执行时,每次都将i*2,也就是说i会距离n越来越近。假设x为循环的执行次数,那么2^x = n。大白话意思就是当i乘了2的x次时,i就不小于n了,也就是循环结束了。循环次数x就等于 log2n。所以时间复杂度为 O(log2n)。
3.3线性阶O(n)

相较于对数阶,线性阶很好理解。时间频度与n存在一次方关系,就称为线性阶。

public static void linear(int n){
   for (int i = 0; i <n ; i++) {
       System.out.println(n);
   }
}
3.4线性对数阶O(nlog2n)
理解了对数阶,线性对数阶也比较好理解,即将时间复杂度为对数阶O(log2n)的代码循环执行n次。也就是n*O(log2n),O(nlog2n)。
public static void linearNlog(int n){
    for (int i = 0; i <n ; i++) {
        while(i<n){
            i=i*2;
        }
    }
}

3.4平方阶O(n^2)

说白了就是嵌套循环。

public static void square(int n){
    for (int i = 0; i <n ; i++) {
        for (int j = 0; j < n; j++) {
            System.out.println(n);
        }
    }
}
3.4立方阶O(n^2),K次方阶 O(n^k)与平方阶都类似,无非是多嵌套基层循环的问题。

四、平均时间复杂度与最坏时间复杂度

4.1 平均时间复杂度:假设所有可能的输入实例出现的概率均等的情况下该算法的运行时间。
4.2 最坏时间复杂度:最坏情况下的时间复杂度称为最坏时间复杂度。一般我们讨论时间复杂度均是以最坏来讨论,因为我们在设计系统时往往优先考虑的时最坏的情况。这保证了我们系统的稳定性。
关于空间复杂度,我这里就不做解释了。第一本人水平有限,第二在当前时代下的软件开发中,用户更注重程序的执行速度,为了追求执行速度我们开发人员更多时间是关注于如何降低时间复杂度。所以这就是为什么我们要用缓存,也就是空间换时间的办法来追求速度。而空间更多取决于硬件,这不是我们关注的重点(而且现在硬件越来越廉价了)。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355