时间、空间复杂度

news2024/10/6 8:22:50

1、概念   

时间复杂度

        时间复杂度是指算法执行所需的时间,通常用算法执行的操作次数来表示。时间复杂度通常用大 O 表示法来表示,其中 O 表示算法的渐近时间复杂度。例如,O(n)表示算法的执行时间与输入规模 n 成正比,O(n^2)表示算法的执行时间与输入规模 n 的平方成正比。

        时间频度T(n)中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律,为此我们引入时间复杂度的概念。算法的时间复杂度也就是算法的时间度量,记作:T(n) = O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称「时间复杂度」。

空间复杂度

        空间复杂度是指算法执行所需的空间,通常用算法所需的存储空间来表示。空间复杂度也通常用大 O 表示法来表示。例如,O(n)表示算法所需的存储空间与输入规模 n 成正比,O(n^2)表示算法所需的存储空间与输入规模 n 的平方成正比。

        S(n)=O(f(n)),其中n为问题的规模,S(n)表示空间复杂度。

2、计算方法

时间复杂度

        下面是几种常见的时间复杂度计算方法:

  1. 常数时间复杂度(O(1)):如果算法的执行时间与输入规模 n 无关,即无论输入规模如何,算法的执行时间都是固定的,则称该算法具有常数时间复杂度。例如,简单的赋值操作和基本的数学运算(如加、减、乘、除)通常具有常数时间复杂度。

  2. 线性时间复杂度(O(n)):如果算法的执行时间与输入规模 n 成正比,则称该算法具有线性时间复杂度。例如,遍历一个长度为 n 的数组或链表的操作通常具有线性时间复杂度。

  3. 平方时间复杂度(O(n^2)):如果算法的执行时间与输入规模 n 的平方成正比,则称该算法具有平方时间复杂度。例如,对一个长度为 n 的数组进行排序的冒泡排序算法具有平方时间复杂度。

  4. 对数时间复杂度(O(log n)):如果算法的执行时间与输入规模 n 的对数成正比,则称该算法具有对数时间复杂度。例如,二分查找算法具有对数时间复杂度。

  5. 指数时间复杂度(O(2^n)或 O(n!)):如果算法的执行时间与输入规模 n 的指数成正比,则称该算法具有指数时间复杂度。这种情况通常发生在算法包含递归或迭代次数与输入规模成指数关系的情况下。指数时间复杂度的算法通常在实际应用中是不可接受的,因为它们对于较大的输入规模可能需要非常长的时间来执行。

空间复杂度

下面是几种常见的空间复杂度计算方法:

  1. 常数空间复杂度(O(1)):如果算法的执行时间与输入规模 n 无关,即无论输入规模如何,算法的执行时间都是固定的,则称该算法具有常数空间复杂度。例如,简单的赋值操作和基本的数学运算(如加、减、乘、除)通常具有常数空间复杂度。

  2. 线性空间复杂度(O(n)):如果算法的执行时间与输入规模 n 成正比,则称该算法具有线性空间复杂度。例如,遍历一个长度为 n 的数组或链表的操作通常具有线性空间复杂度。

  3. 平方空间复杂度(O(n^2)):如果算法的执行时间与输入规模 n 的平方成正比,则称该算法具有平方空间复杂度。例如,对一个长度为 n 的数组进行排序的冒泡排序算法具有平方空间复杂度。

  4. 对数空间复杂度(O(log n)):如果算法的执行时间与输入规模 n 的对数成正比,则称该算法具有对数空间复杂度。例如,二分查找算法具有对数空间复杂度。

  5. 指数空间复杂度(O(2^n)或 O(n!)):如果算法的执行时间与输入规模 n 的指数成正比,则称该算法具有指数空间复杂度。这种情况通常发生在算法包含递归或迭代次数与输入规模成指数关系的情况下。指数空间复杂度的算法通常在实际应用中是不可接受的,因为它们对于较大的输入规模可能需要非常长的时间来执行。

常见的空间复杂度仍然以O(1)、O(n)、O(n^2)为主。

3、举例说明

3.1 时间复杂度

常数时间复杂度(O(1))

        表示该算法的执行时间(或执行时占用空间)总是为一个常量,不论输入的数据集是大是小,只要是没有循环等复杂结构,那这个代码的时间复杂度就都是O(1)

int i = 1;
int j = 2;
int k = i + j;

        上述代码在执行的时候,它消耗的时候并不随着某个变量的增长而增长,那么无论这类代码有多长,即使有几万几十万行,都可以用O(1)来表示它的时间复杂度。 

线性空间复杂度(O(n))

        表示一个算法的性能会随着输入数据的大小变化而线性变化,如

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

        这段代码,for循环里面的代码会执行n遍,因此它消耗的时间是随着n的变化而变化的,因此这类代码都可以用O(n)来表示它的时间复杂度。

平方时间复杂度(O(n^2))

        表示一个算法的性能将会随着输入数据的增长而呈现出二次增长。最常见的就是对输入数据进行嵌套循环。如果嵌套层级不断深入的话,算法的性能将会变为立方阶O(n^3),O(n^4),O(n^k)以此类推

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

对数时间复杂度(O(log n))

while (i < n) {
    i = i * 2;
    System.out.println(i);
}

        上面的代码,在while循环里面,每次都将 i 乘以 2,乘完之后,i 距离 n 就越来越近了,直到i不小于n退出。我们试着求解一下,假设循环次数为x,也就是说 2 的 x 次方等于 n,则由2^x=n得出x=logn。因此这个代码的时间复杂度为O(log n)。

指数时间复杂度(O(2^n))

        表示一个算法的性能会随着输入数据的每次增加而增大两倍,典型的方法就是裴波那契数列的递归计算实现 

public int fibonacci(int n) {
    if (n <= 1) {
        return n;
    }
    return fibonacci(n - 1) + fibonacci(n - 2);
}

3.2 空间复杂度

常数时间复杂度(O(1))

        如果算法执行所需要的临时空间不随着某个变量n的大小而变化,即此算法空间复杂度为一个常量,可表示为 O(1)

int i = 1;
int j = 2;
int k = i + j;

        代码中的 i、j、k 所分配的空间都不随着处理数据量变化,因此它的空间复杂度 S(n) = O(1) 

线性空间复杂度(O(n))

int m=new int[n];
for(int i=0;i<n;i++){
    j=i;
    j++;
}

        这段代码中,第一行new了一个数组出来,这个数据占用的大小为n,这段代码的2-6行,虽然有循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,即 S(n) = O(n) 。

平方时间复杂度(O(n^2))

int m = new int[n];
int squareM = new int[n][n];
for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        squareM[i][j] = m[i] * m[j];
    }
}

        这段代码中,我们首先创建了一个大小为n的整数数组,并初始化每个元素。然后,我们创建了一个二维整数数组,其中每个元素都是原始数组中两个元素的乘积。在这个过程中,我们使用的额外存储空间与输入数据的大小的平方成正比,因此空间复杂度为O(n^2)。

3.3 复杂度曲线

4、总结

        在实际应用中,我们通常更关注时间复杂度,因为它对算法的性能影响更大。然而,在某些情况下,例如处理大规模数据集时,空间复杂度也可能非常重要。      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1271160.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java基础之常用类

Java基础之常用类 一、包装类1.1、Java基本数据类型及其对应的包装类1.2、包装类的自动装箱、自动拆箱机制1.3、包装类的优点 二、String类三、StringBuffer类和StringBuilder类3.1、主要区别&#xff1a;3.2、StringBuffer/StringBuilder用法(两者用法一致) 四、日期类4.1、Da…

单点登录平台设计

1.基本介绍 1.1什么是单点登录 单点登录&#xff08;Single Sign-On&#xff0c;简称SSO&#xff09;是一种身份认证的解决方案&#xff0c;它允许用户只需一次登录即可访问多个应用程序或系统。在一个典型的SSO系统中&#xff0c;用户只需通过一次身份认证&#xff0c;就可以…

CV计算机视觉每日开源代码Paper with code速览-2023.11.27

点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【图像分割】SEGIC: Unleashing the Emergent Correspondence for In-Context Segmentation 论文地址&#xff1a;https://arxiv.org//pdf/2…

SpringCloudAlibaba微服务 【实用篇】| Nacos配置管理

目录 一&#xff1a;Nacos配置管理 1. 统一配置管理 2. 配置热更新 3. 配置共享 4. 搭建Nacos集群 tips&#xff1a;前些天突然发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff0c;感兴趣的同学可以进…

nginx: [alert] could not open error log file

先把cmd的报错信息粘出来 nginx: [alert] could not open error log file: CreateFile() “logs/error.log” failed (3: The system cannot find the path specified) 2023/11/29 11:27:37 [emerg] 5040#18772: CreateDirectory() “D:\enviroment\nginx-1.24.0\conf/temp/cli…

c#把bitmap格式转换为其他格式图片

增加引用命名空间 using System.Drawing.Imaging; 打开对话框的方式读入bmp格式图片&#xff0c;转换为其他格式。 也可以直接传入图片名称。 OpenFileDialog ofd new OpenFileDialog();ofd.Title "打开对话框";ofd.InitialDirectory "D:/";ofd.Filt…

Python基础语法之学习占位符

Python基础语法之学习占位符 一、代码二、效果 一、代码 name "张三" sex "男" age 10 money 12.5# 通过占位符完成拼接 print("姓名&#xff1a;%s" % name) print("姓名&#xff1a;%s,性别&#xff1a;%s" % (name, sex))text…

nexus制品库的介绍及详细部署使用

一、nexus 介绍 Nexus 是一个强大的仓库管理工具&#xff0c;用于管理和分发 Maven、npm、Docker 等软件包。它提供了一个集中的存储库&#xff0c;用于存储和管理软件包&#xff0c;并提供了版本控制、访问控制、构建和部署等功能。 Nexus 可以帮助开发团队提高软件包管理的效…

直流负载与交流负载的作用

直流负载和交流负载都是用来消耗电能的装置或设备&#xff0c;它们的作用是将电能转化为其他形式的能量&#xff0c;以满足特定的需求。直流负载主要用于直流电路中&#xff0c;例如直流电源、电池等。它们可以将直流电能转化为热能、光能、机械能等。直流负载在很多领域都有广…

JavaScript图片处理大揭秘!掌握文件流处理方法

说在前面 &#x1f4bb;作为一名前端开发&#xff0c;我们平时也少不了对文件流数据进行处理&#xff0c;今天简单整理一下日常开发中比较常见的一些处理文件流的场景及处理方法&#xff0c;希望可以帮助到大家&#xff0c;挤出多一点的摸鱼学习时间。 常见场景 一、input框上…

uniapp + electron 打包项目

参考文献 1、控制台安装electron和electron打包工具electron-packager npm install electron -g npm install electron-packager -g2、manifest.json修改 运行的基础路径修改为&#xff1a;./ 不然打包出来会出现白屏&#xff0c;读取不到&#xff0c;因为打包出来的h5默认加…

强大的Kubernetes工具的完整指南

在容器化应用程序编排方面&#xff0c;Kubernetes是市场的领导者。它允许用户在多主机环境中管理容器&#xff0c;提供工作负载分配和网络处理。 此外&#xff0c;它还提供了许多在DevOps过程中至关重要的特性&#xff0c;例如自动扩展、自动修复和负载平衡。这些功能解释了Kub…

xcconfig(环境变量) 的使用

xcconfig&#xff08;环境变量&#xff09; 的使用 文章目录 xcconfig&#xff08;环境变量&#xff09; 的使用一、上手使用1、添加 xcconfig 文件2、在文件中添加数据3、将文件配置到工程中4、使用环境变量5、使用 Pod 的项目 二、语法1、注释&#xff1a;2、包含语句&#x…

C语言之“可变参数<stdarg.h>”

目录 前言 stdarg.h头文件 实例&#xff1a;遍历并求和所有传递给sum函数的额外实际参数 前言 有时我们会希望函数带有可变数量的参数就像printf&#xff08;cosnt char* format ...&#xff09;和scanf&#xff08;cosnt char* format ...&#xff09;那样除了有一个参数 …

ArkTS-文本滑动选择器弹窗

文本滑动选择器弹窗 根据指定的选择范围创建文本选择器&#xff0c;展示在弹窗上。 示例 Entry Component struct TextPickerDialogExample {State select: number 2private fruits: string[] [苹果, 香蕉, 橘子, 梨儿, 桃儿]build() {Row() {Column() {Text(当前选择为&…

windows系统bat脚本命令总结之reg命令

前言 做了一段时间的bat脚本开发&#xff0c;bat脚本中有各种各样的命令跟传统的编程逻辑完全不同&#xff0c;本专栏会讲解下各种各式的命令使用方法。 本篇文章讲解的是windows系统注册表操作命令"reg"。 reg命令简介 “reg” 是 Windows 操作系统中的一个命令行工…

关于前端学习的思考-浮动元素和块级元素的关系

先摆关系&#xff1a;浮动元素嵌套块级元素&#xff0c;浮动元素和块级元素是上下关系。 1、浮动元素为父盒子&#xff0c;块级元素为子盒子。 父盒子为浮动元素&#xff0c;子盒子不会继承。如图floatnone&#xff1b; 摆结论&#xff1a;子盒子为行内元素&#xff0c;行内块…

智能优化算法应用:基于群居蜘蛛算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于群居蜘蛛算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于群居蜘蛛算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.群居蜘蛛算法4.实验参数设定5.算法结果6.参考…

excel 计算断面水质等级

在工作中遇到根据水质监测结果要判断断面等级。写了下面的公式&#xff1a; 因子标准值 limits {COD: [15,15, 20, 15,20],氨氮: [0.15, 0.5, 1, 1.5, 2.0],总磷: [0.02, 0.1, 0.2, 0.3, 0.4] } excel公式&#xff1a; IFS(MAX(IF(M2>20,1,0), IF(N2>2,1,0), IF(O2&g…

夜莺项目发布 v6.4.0 版本,新增全局宏变量功能

大家好&#xff0c;夜莺项目发布 v6.4.0 版本&#xff0c;新增全局宏变量功能&#xff0c;本文为大家简要介绍一下相关更新内容。 全局宏变量功能 像 SMTP 的配置中密码类型的信息&#xff0c;之前都是以明文的方式在页面展示&#xff0c;夜莺支持全局宏变量之后&#xff0c;可…