首页 > 其他分享 >【基础知识整理】时间复杂度 & 空间复杂度

【基础知识整理】时间复杂度 & 空间复杂度

时间:2024-03-14 21:22:05浏览次数:16  
标签:复杂度 基础知识 空间 算法 时间 整理 执行 代码

原文链接:https://blog.csdn.net/fumeidonga/article/details/131070661

时间复杂度是指执行算法所需时间的增长率,而空间复杂度则是指执行算法所需存储空间的增长率。

一、时间复杂度

通常与输入数据进行比较,时间复杂度不是指具体的时间,而是算法的运算次数,是相对于问题规模的相对量。

举例:

当规模增长10倍时,算法的运行时间也增长了10倍,则该算法的时间复杂度为O(1)。如果规模增长10倍时,算法的运行时间增长了100倍,则该算法的时间复杂度为O(10)。

时间复杂度表示方法 - 大 O 表示法

算法的执行时间与每行代码的执行次数成正比,用 T(n) = O(f(n)) 表示,

T(n) :算法执行总时间,

f(n) :每行代码执行总次数

n: 数据的规模

实际上并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势。

所以常量、低阶、系数实际上对这种增长趋势不产生决定性影响,我们在做时间复杂度分析时忽略这些项。

假设我们有一段代码

	public static void main(String[] args) {

		int i = 10;
		for (int j = 0; j < i; j++) {
			System.out.println("j" + j);
		}
	}

  当运行这段代码时,所有语句的执行都需要花费时间,我们假设每条语句的执行时间一样,我们将代码进行拆解,如下

我们将这些次数加起来,总执行次数就 = 3 * i + 3; 当i 趋向于无穷大时, 我们可以忽略常数、低阶项、及高阶系数,这样总执行次数就 = i
T(i) = O(i)

时间复杂度计算

  1. 得出运行时间的函数
  2. 对函数进行简化,只保留最高阶项 (忽略常数、低阶项、及高阶系数等)
  3. 下面我们分别来举例说明

    常数阶
    时间复杂度为 T(n) = O(1)

    function aFun() {
    console.log("Hello, World!"); // 需要执行 1 次
    return 0; // 需要执行 1 次
    }
    

      

    我们看到总共要执行2次,我们来简化一下,用1取代所有的常量,就变成了O(1)

    时间复杂度为 T(n) = O(n)

    function bFun(n) {
    for(let i = 0; i < n; i++) { // 需要执行 (n + 1) 次
    console.log("Hello, World!"); // 需要执行 n 次
    }
    return 0; // 需要执行 1 次
    }
    

      

    总共需要执行 3n + 2次,简化一下,O(n)

    时间复杂度为 T(n) = O(n^2)

    function cal(n) {
    let sum = 0; // 1 次
    let i = 1; // 1 次
    let j = 1; // 1 次
    for (; i <= n; ++i) { // n 次
    j = 1; // n 次
    for (; j <= n; ++j) { // n * n ,也即是 n平方次
    sum = sum + i * j; // n * n ,也即是 n平方次
    }
    }
    }
    

     

    时间复杂度为 T(n) = O(log2n)

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

      

    代码是从 1 开始,每次循环就乘以 2,当大于 n 时,循环结束。
    其实就是高中学过的等比数列,i 的取值就是一个等比数列。在数学里面是这样子的:
    20 21 22 ... 2k ... 2x = n
    所以,我们只要知道 x 值是多少,就知道这行代码执行的次数了,通过 2x = n 求解 x,
    数学中求解得 x = log2n 。所以上面代码的时间复杂度为 O(log2n)。

    二、空间复杂度
    空间复杂度全称就是渐进空间复杂度(asymptotic space complexity),表示算法的存储空间与数据规模之间的增长关系

    定义:算法的空间复杂度通过计算算法所需的存储空间实现,是对一个算法在运行过程中临时占用存储空间大小的量度

    算法的空间复杂度的计算公式记作:S(n) = O(f(n)),

    空间复杂度计算

    public static void main(String[] args) {
    
    int i = 10;
    for (int j = 0; j < i; j++) {
    System.out.println("j" + j);
    }
    }
    

     

    随着i的变化,所需开辟的内存空间并不会随着i的变化而变化,因为 这 i、j 用的时相同的空间, i 、j各一个,简化一下就是 O(1)

    n :问题的规模,

    f(n) :语句关于 n 所占存储空间的函数。

    function print(n) {
    const newArr = []; // 第 2 行
    newArr.length = n; // 第 3 行
    for (let i = 0; i <n; ++i) {
    newArr[i] = i * i;
    }
    
    for (let j = n-1; j >= 0; --j) {
    console.log(newArr[i]) 当消耗空间和输入参数n保持线性增长
    }
    }
    

      

    第 2 行代码中,申请了一个空间存储变量 newArr ,是个空数组。
    第 3 行把 newArr 的长度修改为 n 的长度的数组,每项的值为 undefined ,
    除此之外,剩下的代码都没有占用更多的空间,所以整段代码的空间复杂度就是 O(n)

    我们常见的空间复杂度就是 O(1)、O(n)、O(n^2)

 

标签:复杂度,基础知识,空间,算法,时间,整理,执行,代码
From: https://www.cnblogs.com/Dongmy/p/18074015

相关文章

  • 2024年最新腾讯云优惠券获得方法整理
    腾讯云作为国内领先的云服务提供商,其优质的产品和服务深受用户喜爱。而腾讯云优惠券则是用户在使用腾讯云服务时能够享受到的一项福利,可以有效降低上云成本。那么,2024年如何获得腾讯云优惠券呢?本文将为大家详细整理最新腾讯云优惠券获得方法。方法一:腾讯云官网活动页面腾讯......
  • docker基础知识
    Docker容器基础介绍和操作-清白之年980410-博客园<linkrel="stylesheet"href="/css/blog-common.min.css?v=g-c5Yfdgh3oAoyQibjhmJ6ylVcBcMRHNIG6JkF70hpY"/><linkid="MainCss"rel="stylesheet"href="/skins/mountainink......
  • 必知必会——SQL语句基本语法整理
     一、数据库表1.新建数据库2.新建数据库表createtable表名(列名1数据类型[约束条件],列名2数据类型[约束条件],……)'''创建一个demo1表a列数据类型为int,是主键b列数据类型为char,该列的数据必须唯一不可重......
  • GaussDB的gs_dump工具问题整理,疑似BUG
     GaussDB的gs_dump工具问题整理,疑似BUG 目前分布式GaussDB用起来问题感觉巨多啊。版本信息如下:09:04:11root@postgres>selectversion();-[RECORD1]-----------------------------------------------------------------------------------------------------------......
  • 【Java面试题-基础知识01】Java数据类型四连问?
    一、Java中的基础数据类型有哪些?Java中的基本数据类型包括:1.byte:8位有符号整数,范围为-128到127。2.short:16位有符号整数,范围为-32768到32767。3.int:32位有符号整数,范围为-2147483648到2147483647。4.long:64位有符号整数,范围为-9223372036854775808到9223372036854775807。5.......
  • Oracle创建用户,授权,取消授权常用语句整理
    --删除用户及及用户下的所有数据dropuserxxxcascade;--创建用户赋予密码createuserxxxidentifiedby1234;--赋予权限grantdbatoxxx;--删除权限revokedbafromxxx;--赋予用户登录数据库的权限grantcreatesessiontoxxx;--授予用户操作表的权限gran......
  • go语言入门基础知识
    目录序安装常用命令一、数据类型1.布尔值2.字符串字符串遍历3.字符4.整型位运算5.浮点6.复数7.map二、常量、变量1.变量2.常量3.预定义常量iota4.枚举三、流程控制1.条件语句2.选择语句3.循环语句4.跳转语句四、函数不定参数匿名函数与闭包make()函数new函数闭包defer五、数组1.......
  • Android Framework基础知识
    哈喽大家好,我是Zzz.给大家分享一篇Framework入门的基础知识文章,内容纯纯原创。一、Application,Activity和进程的关系?  Application、Activity只是进程虚拟机运行的一个类对象,只是属于系统的一个组件和进程没有直接联系。Android支持为每个组件可以单独进程方式运行。 ......
  • Django基础知识点一
    Django基础知识点【零】补充方法【1】Django项目测试if__name__=='__main__':importosimportdjangoos.environ.setdefault('DJANGO_SETTINGS_MODULE','BookSystem.settings')django.setup()'''测试代码''......
  • 链表基础知识详解
    引言在计算机科学中,数据结构是存储、组织数据的方式。而链表,作为一种基础而强大的数据结构,因其独特的特性,在多种算法和应用场景中拥有不可替代的地位。什么是链表,为什么要使用链表链表(LinkedList)是一种线性表,但与数组不同的是,链表中的元素在内存中并不是连续放置的。每......