时间复杂度和空间复杂度笔记

1.jpeg

复杂度分析笔记

复杂度主要分为时间和空间复杂度

时间复杂度:算法(程序)执行的时间变化趋势

空间复杂度:算法(程序)执行的内存空间使用量

复杂度分析,不是通过工具测量计算出来的,而是估量算法运行所要消耗的时间

通过代码来练习代码复杂度分析

int cal(int n){
    int sum = 0;
    int i = 1
    for(; i < n; i++){
        sum = sum + i;
    }
    return sum;
}

假设每行代码的执行时间都是一样的,unit_time;

再来看这段代码:

第2,3行只执行了一遍,需要时间为2*unit_time

第4,5行执行了n+n编,需要时间为2n*unit_time

所以这段代码需要的总时间T(n) = (2n + 2) * unit_time

再看如下这段代码

int cal(int n){
    int sum = 0;
    int i = 1;
    int j = 1;
    for(;i<n;i++){
        for(;j<n;j++){
            sum = sum + i*j;
        }
    }
    return sum;
}

第2,3,4行执行了一遍 3*unit_time

第5行,执行了n遍,n*unit_time

第6,7行,2n^2

所以这段代码需要的总时间为T(n) = (3+n+2n^2)*unit_time

可以看出来所有的代码的执行时间和每行代码执行的次数成正比

T(n) = O(f(n))

其中的f(n)为代码执行次数的函数

O(n)函数表示代码执行时间与代码执行次数f(n)成正比

这种方法称为大O表示法,并不表示算法执行的具体时间,而是表示随着数据规模增长的变化趋势

随着数据规模不断增大,常数对对时间的影响可以忽略不记

所以上面的两个时间复杂度可以表示为O(n) O(n^2)

时间复杂度分析的几种方法

1.只关注循环 次数最多的那一段代码:

int cal(int n){
    int sum = 0;
    int i = 1
    for(; i < n; i++){
        sum = sum + i;
    }
    return sum;
}

如同上面举过的例子

这里执行次数最多的是第4,5行,其它行数为常数,可以忽略不记,所以这段代码的时间复杂度为O(n)

2.加法法则:总的复杂度等于量级最大的那段代码的复杂度

int cal(int n) { 
    int sum_1 = 0 ;
    int i = 1;
    for(;i < n; i++){
        sum_1 = sum_1 + i;
    }
    
    int sum_2 = 0;
    int j = 1;
    for(;i < n; i++){
        for(;j < n; j++){
            sum_2 = sum_2 + i*j;
        }
    }
    return sum_1 + sum_2;
}

可以把这段代码分为两部分来看

第一部分 时间复杂度为O(n)

第二部分时间复杂度为O(n^2)

总的时间复杂度,我们取那个最大的,所以时间复杂度为O(n^2)

换算为公式:T(n) = max(O(f(n)),O(g(n)));

3.乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

int cal(int n){
    int sum = 0;
    int i = 1;
    for(;i < n; i++){
       sum = sum + f(i);
    }
    return sum;
}

int f(int n){
    int sum = 0;
    int i = 1;
    for(;i < n; i++){
        sum = sum + i;
    }
    return sum;
}

上面这段代码,如果f(n)是一段普通的操作,则时间复杂度为O(n)

但是,f(n)不是一份简单的操作,他是一段函数 ,所以总的时间复杂度

T(n) = O(n) * O(n) = O(n^2

需要注意的几点

1.O(1)

O(1)表示时间复杂度为常量,并不是说只有一行代码。即使代码有成千上万行,只要是常数,就记为O(1)

int i = 0;
int j = 1;
sum = i + j;

上面那段代码为O(1)而不是O(3)

2.O(logn) O(nlogn)

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

计算上述代码的时间复杂度,关键是计算出来代码执行的次数

2^x = n 所以x = log2 n

所以上述时间复杂度为O(log2n)

采用大O计数法,忽略次数,记为O(logn)

3.O(m + n) O(m * n)

int cal(int m, int n) {
  int sum_1 = 0;
  int i = 1;
  for (; i < m; ++i) {
    sum_1 = sum_1 + i;
  }

  int sum_2 = 0;
  int j = 1;
  for (; j < n; ++j) {
    sum_2 = sum_2 + j;
  }

  return sum_1 + sum_2;
}

上述代码,因为m,n的值未知,不清楚谁大谁小,不能省略其中的一个,无法使用加法法则

时间复杂度为O(m + n),

可以使用乘法法则:O(m * n )

空间复杂度分析

void print(int n) {
  int i = 0;
  int[] a = new int[n];
  for (i; i <n; ++i) {
    a[i] = i * i;
  }

  for (i = n-1; i >= 0; --i) {
    print out a[i]
  }
}

可以看到上述代码:

只有在第3行的时候才使用了n大小的数组,其余地方都没有使用多余的空间,所以这段代码的空间复杂度为O(n).

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,104评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,816评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,697评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,836评论 1 298
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,851评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,441评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,992评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,899评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,457评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,529评论 3 341
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,664评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,346评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,025评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,511评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,611评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,081评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,675评论 2 359

推荐阅读更多精彩内容

  • IntelliJ Idea 常用快捷键列表 1、Ctrl+Shift + Enter,语句完成2、“!”,否定完成...
    96705f1c5813阅读 247评论 0 0
  • 昨天终于把ls_MVP(MinimumViableProduct)的基本功能都实现了: 今天要把ls_MVP修改得...
    每日派森阅读 156评论 0 1
  • 标题 这是一级标题 这是二级标题 这是三级标题 这是四级标题 这是五级标题 这是六级标题 字体 这是加粗的文字这是...
    无为真君阅读 151评论 0 0
  • 今天有一個剛結婚不久的朋友跟我說“現在覺得你的想法也挺好的,一個人好好過自己的生活也很不錯”,然後聊了一下她最近的...
    HaiyanF阅读 95评论 0 0
  • 写在前面:一直认为,“种瓜得瓜,种豆得豆”是一句至理名言。换句话说,我也认为,我们需要把“出来混,早晚都要还的”铭...
    9954e3069b3d阅读 642评论 4 2