关于时间复杂度和空间复杂度的理解

做算法题,很重要的一点就是,需要分析算法的时间按复杂度和空间复杂度。
这里看一下对于时间复杂度和空间复杂度的理解

1. 时间复杂度(time complexity)

1.1 语句频度T(n): 算法执行需要的时间,理论上只能通过上机来测试出来,但是我们不可能对所有的算法都来上机测试。我们只需要知道哪个算法用时比较多即可。一个算法花费的时间与算法中基本操作语句的执行次数成正比,哪个算法中语句执行次数多,哪个算法用时就长。而一个算法中语句执行的次数叫做语句频度,计作 T(n)。

总结一下,就是说我们用 T(n) 来算法执行的时间。

1.2 时间复杂度: 在T(n)中,n 叫做问题的规模,当 n 不断变化时,语句频度 T(n) 也会变化。我们想知道T(n) 的变化规律,于是便引入了时间复杂度的概念。
在衡量时间复杂度时候,我们通常用 O(x) 的概念。这里需要知道量级的概念:
如果
\lim_{n \to \infty}{T(n)\over f(n)}=a \space\space\space这里的a代表非0常数
这是时候,我们称作 f(n) 是 T(n) 同数量级函数,就计作 T(n)=O(f(n)),也就把 O(f(n)) 叫做算法的 渐进时间复杂度,简称 时间复杂度。
需要明白的是,语句频度T(n) 不同,时间复杂度也是可以相同的,直观理解就是说看最高次项。比如 T(n)=n^2+5n+6 和 T(n)=3n^2+n+3,时间复杂度都是 O(n^2)

1.3 常见时间复杂度: 常数阶O(1),对数阶O(log_2n),线性阶O(n),线性对数阶O(nlog_2n),平方阶O(n^2),立方阶O(n^3),k次方阶O(n^k),指数阶 O(2^n)。随着问题规模 n 的不断增大,上述时间复杂度不断增大,算法执行效率越低。

不同时间复杂度时间变化图

1.4 平均时间复杂度和最坏时间复杂度:
这里只需要明白,最坏时间复杂度是用来确定上界的。而且一般情况下,讨论的时间复杂度都是最坏时间复杂度。

1.5 如何求时间复杂度:
这里就每一种情况我们来给出例子和分析。

(1) 常数阶 O(1)----算法的执行时间不随着问题规模 n 的增长而增长。即使算法中有千万条语句,最终的执行时间也不过是一个较大的常数。

  public static void main(String[] args) {
        int x = 91;
        int y = 100;
        while (y > 0) {
            if (x > 100) {
                x = x - 10;
                y--;
            } else {
                x++;
            }
        }
    }

这段代码,总共循环了 1100次,但是可以看到,跟问题规模n没有关系。所以是一个常数阶的算法。

(2)对数阶O(log_2n)---- 这里需要推导一下。

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

假设这里的运行次数是T(n),由代码可知:2^{T(n)}=n,则可以求出来 T(n)=log_2n,就是线性对数阶。

(3) 线性对数阶O(nlog_2n)---- 这里的证明使用归纳法

快排代码

可以看到,快排就是线性对数阶的时间复杂度。除此之外,还有归并排序和堆排序。

(4)线性阶 O(n)-----就是单层循环。

for(int i=0;i<nums.lengt;i++){
    nums[i]++;  
}

(5) 平方阶 O(n^2)------ 就是双层循环

for(int i=0;i<nums.lengt;i++){
    for(int j=i+1;j<nums.lengt;j++){
      nums[i] = nums[j];
}

(6) 立方阶 O(n^3)------ 就是三层循环

同上

(7) k次方阶O(n^k)------ k层循环

同上

(8) 指数阶O(2^n) ------

2. 空间复杂度 (space complexity)

空间复杂度,是说程序运行时临时占用的空间的大小。同上面说过的时间复杂度,计作 S(n)=O(f(n))
一个算法除了需要存储本事所使用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些计算所需的辅助空间。总的来说,算法执行时所需的存储空间包括以下两个部分。

  • 固定部分------这部分空间的大小与输入/输出的数据个数、数值无关。主要包括指令空间(代码空间)、数据空间(常量、简单变量)等所占的空间。属于静态空间。
  • 可变空间------主要包括动态分配的空间,以及递归栈所需的空间等。这部分空间大小与算法有关。
    举一个栗子
public void reserse(int[] a, int[] b) {
        int n = a.length;
        for (int i = 0; i < n; i++) {
            b[i] = a[n - 1 - i];
        }
    }

这部分代码中,函数 reverse() 运行时,要分配的内存空间包括:引用a、引用b、局部变量n、局部变量i。
因此有 f(n)=4,所以有空间复杂度 S(n)=O(1)

3. 总结

总的来说,我们更加关注算法的时间按复杂度。而时间按复杂度与两个因素有关:算法中的嵌套循环层数 + 最内层循环的次数
一般来说,指数的时间复杂度是不被接受的,只能在 n 比较小的时候来用,其他的多项式时间复杂度是可以接受的。

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

推荐阅读更多精彩内容