精简版时间复杂度与空间复杂度(五分钟掌握)

前言

一个算法的优劣好坏,会决定一个程序运行的时间、空间。也许当小数据量的时候,这种影响并不明显,但是当有巨量数据的时候,算法的好坏带来的性能差异就会出天差地别。可以说直接影响了一个产品的高度和广度。每个程序员都想用最优的算法解决问题,我们期待自己写出的代码是简洁、高效的。但是如何评判一个算法的好坏呢?时间复杂度和空间复杂度就是一个很好的标准。

1. 时间复杂度

1.1 概念

执行算法所需要的计算工作量

1.2 基本执行次数T(n)

根据计算,得出的该算法在输入数据量为n时的,实际执行次数

1.3 时间复杂度

根据基本执行次数,去除系数、常数项等得到的渐进时间复杂度。用大O表示法。也就是说,随着数据量的剧增,不同常数项和系数,已经大致不能够影响该算法的基本执行次数。常数项和系数对于计算时间复杂度无意义

1.4 举例说明

  1. T(n) = 2: 该函数总共执行两条语句,所以基本执行次数为2;

    时间复杂度为O(1): 该函数的基本执行次数只有常数项,所以时间复杂度为O(1)

void test(int n)
{
    int a;
    a = 10;
}
  1. T(n) = 2n: 该函数共循环n次,每次执行2条语句,所以基本执行次数为2n。时间复杂度舍弃系数,为O(n)
void test(int n)
{
    int cnt;
    for (cnt = 0; cnt < n; cnt++) {
        int a;
        a= 10;
    }
}
  1. T(n) = 2 * (1 + 2 + 3 + 4 + ... + n) + 1 =

    2 * (1 + n) * n / 2 + 1 = n^2 + n + 1。因为共执行(1 + 2 + 3 + 4 + ... + n) 次循环,每次循环执行2条语句,所有循环结束后,最后又执行了1条语句,所以执行次数如上;时间复杂度为O(n^2),因为n和常数项1忽略,它们在数据量剧增的时候,对于执行次数曲线几乎没有影响了

void test(int n)
{
    int cnt1, cnt2;
    for (cnt1 = 0; cnt1 < n; cnt1++) {
        for (cnt2 = cnt1; cnt2 < n; cnt2++) {
            int a;
            a = 10;
        }
    }
    a = 11;
}
  1. T(n) = 2 * logn 因为每次循环执行2条语句,共执行logn次循环;时间复杂度为O(logn),忽略掉系数2
void test(int n)
{
    int cnt;
    for (cnt = 1; cnt < n; cnt *= 2) {
        int a;
        a = 10;
    }
}
  1. T(n) = n * logn * 2 因为每次循环2条语句,共执行n * logn次循环;时间复杂度为O(nlogn),忽略掉系数2
void test(int n)
{
    int cnt1, cnt2;
    for (cnt1 = 0; cnt1 < n; cnt1++) {
        for (cnt2 = 1; cnt2 < n; cnt2 *= 2) {
            int a;
            a = 10;
        }
    }
}
  1. T(n) = 2 * n^3 因为每次循环2条语句,共执行n^3 次循环;时间复杂度为O(n^3),忽略掉系数2
void test(int n)
{
    int cnt1, cnt2, cnt3;
    for (cnt1 = 0; cnt1 < n; cnt1++) {
        for (cnt2 = 0; cnt2 < n; cnt2++) {
            for (cnt3 = 0; cnt3 < n; cnt3++) {
                int a;
                a = 10;
            }
        }
    }
}
  1. 斐波那契数列的递归实现,每次调用该函数都会分解,然后要再调用2次该函数。所以时间复杂度为O(2^n)
int test(int n)
{
    if (n == 0 || n == 1) {
        return 1;
    }
    return (test(n-1) + test(n-2));
}

1.5 时间复杂度比较

O(1) < O(log2n) < O(n) < O(nlog2n) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)

2. 空间复杂度

2.1 概念

一个算法所占用的存储空间主要包括:

  • 程序本身所占用的空间
  • 输入输出变量所占用的空间
  • 动态分配的临时空间,通常指辅助变量

输入数据所占空间只取决于问题本身,和算法无关。我们所说的空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,即第三项。通常来说,只要算法不涉及到动态分配的空间以及递归、栈所需的空间,空间复杂度通常为0(1)。

2.2 举例说明

  1. S(n) = O(1).空间复杂度为O(1),因为只有a, b, c, cnt四个临时变量。且临时变量个数和输入数据规模无关。
int test(int n)
{
    int a, b, c;
    int cnt;
    for (cnt = 0; cnt < n; cnt++) {
        a += cnt;
        b += a;
        c += b;
    }
}
  1. S(n) = O(n).空间复杂度为O(n),因为每次递归都会创建一个新的临时变量a。且共递归n次。
int test(int n)
{
    int a = 1;
    if (n == 0) {
        return 1;
    }
    n -= a;
    return test(n);
}

3. 参考文献

4. 后记

感谢大家的阅读,大家喜欢的请帮忙点下推荐。后面会继续出精彩的内容,敬请期待!



敬告:

本文原创,欢迎大家学习转载_

转载请在显著位置注明:

博主ID:CrazyCatJack

原始博文链接地址:https://www.cnblogs.com/CrazyCatJack/p/12652242.html


CrazyCatJack

精简版时间复杂度与空间复杂度(五分钟掌握)

原文地址:https://www.cnblogs.com/CrazyCatJack/p/12652242.html

时间: 2024-08-03 10:10:15

精简版时间复杂度与空间复杂度(五分钟掌握)的相关文章

常用的排序算法的时间复杂度和空间复杂度

排序法 最差时间分析 平均时间复杂度 稳定度 空间复杂度 冒泡排序 O(n2) O(n2) 稳定 O(1) 快速排序 O(n2) O(n*log2n) 不稳定 O(log2n)~O(n) 选择排序 O(n2) O(n2) 稳定 O(1) 二叉树排序 O(n2) O(n*log2n) 不一顶 O(n) 插入排序 O(n2) O(n2) 稳定 O(1) 堆排序 O(n*log2n) O(n*log2n) 不稳定 O(1) 希尔排序 O O 不稳定 O(1) 1.时间复杂度 (1)时间频度 一个算法执

[分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例)

踏雁寻花 发表于 2015-8-23 23:31:28 https://www.itsk.com/thread-355923-1-4.html 学会封装,只需要掌握十个步骤.五分钟包你学会,不会不交学费~ 适合人群: 1.会装系统 2.了解PE的使用 3.对注册表有初步的了解 所需工具: 1.Windows系统镜像 2.PE(可以放到U盘,如果使用虚拟机封装系统,直接下载PE镜像即可) 3.磁盘清理工具(如Windows7瘦身工具.自由天空系统清理&减肥程序.注册表减肥工具等) 4.驱动包(如万

Log4j快速使用精简版

Log4j快速使用精简版 1.导入log4j-1.2.17.jar包 2.在src根目录下创建log4j.properties文件 log4j.rootLogger=INFO, CONSOLE, FILE ## console 配置文件输出的目的地 (控制台)log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppenderlog4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayoutlog4j

EZ娱乐源码出售时间复杂度和空间复杂度

时间复杂度常见的时间复杂度有EZ娱乐源码出售请添加链接描述(www.1159880099.com) QQ1159880099:常数阶O(1),对数阶O(log2n),线性阶O(n),线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3), k次方阶O(nk),指数阶O(2n),随着问题规模不断扩大,上述时间复杂度不断地增大,算法执行效率越来越低. 一.常数阶(O(1)) <?php//从上到下所有的代码执行一次$a = 123;$b = 456;$c = $a + $b;echo $c

算法基础 -- 简介时间复杂度与空间复杂度

算法是为求解一个问题所需要遵循的.被清楚地指定的简单指令的集合.对于一个问题,一旦给定某种算法并且确定其实正确的,那么重要的一步就是确定该算法将需要多少诸如时间或空间等资源量的问题,这就是时间复杂度和空间复杂度存在的意义.常用时间复杂度和空间复杂度来衡量不同算法的优劣. 一.从数学的角度理解 O(n).Ω(n).o(n)和Θ(n) 通常,我们以函数所处理的数据量来表示算法的性能,也就是说,对于大小为 n 的数据,我们用函数 f(n) 来表示它的算法性能.在很多情况下,我们可以完全确定 f 的具体

让 Chrome 57 支持迅雷精简版

感觉下面步骤麻烦的,可以翻到文章最后,提供了全部文件打包,Chrome 扩展最好还是去 Chrome 商店安装 详细步骤 1. 安装迅雷精简版 迅雷精简版 1.5.3.288 最终更新官网下载 http://down.sandai.net/mini/ThunderMini_dl1.5.3.288.exe 2. 下载迅雷 Chrome 扩展额外支持包 http://plugin.xl7.xunlei.com/7.9/func/xl_ext_chrome_setup.exe 3. 使用 7zip 解

算法的时间复杂度和空间复杂度

<算法的时间复杂度和空间复杂度合称为算法的复杂度> --->算法的时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道.但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了.并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多.一个算法中的语句执行次数称为语句频度或时间频度.记为T(n). (2)时间复杂度 在刚才提到的时间频度中,n称为问题的规模

算法时间复杂度和空间复杂度详解

算法的时间复杂度和空间复杂度合称为算法的复杂度. 1.时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道.但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了.并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多.一个算法中的语句执行次数称为语句频度或时间频度.记为T(n). (2)时间复杂度 在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时

数据结构和算法之时间复杂度和空间复杂度

前言 上一篇<数据结构和算法>中我介绍了数据结构的基本概念,也介绍了数据结构一般可以分为逻辑结构和物理结构.逻辑结构分为集合结构.线性结构.树形结构和图形结构.物理结构分为顺序存储结构和链式存储结构.并且也介绍了这些结构的特点.然后,又介绍了算法的概念和算法的5个基本特性,分别是输入.输出.有穷性.确定性和可行性.最后说阐述了一个好的算法需要遵守正确性.可读性.健壮性.时间效率高和存储量低.其实,实现效率和存储量就是时间复杂度和空间复杂度.本篇我们就围绕这两个"复杂度"展开