时间复杂度 空间复杂度

news2024/11/27 21:51:48

概览

时间复杂度与空间复杂度的作用是在衡量一个算法的优劣性,以及在二者之间进行权衡,寻找二者的平衡点。

时间复杂度是指执行算法所需时间的增长率,而空间复杂度则是指执行算法所需存储空间的增长率。
高时间复杂度的算法可能需要在短时间内完成大规模数据的计算,而高空间复杂度的算法可能需要占用大量的内存空间。

在进行算法设计和分析时,通常需要在时间和空间之间进行权衡,以找到适合特定问题的最佳算法。了解算法的时间和空间复杂度可以帮助我们确定在处理不同问题时哪些算法是可行的,以及如何优化算法以减少其时间和空间的占用。

  1. 数据结构和算法解决是 “如何让计算机时间更快、空间更省的方式解决问题”。
  2. 因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能。
  3. 分别用时间复杂度(算法执行时间)和空间复杂度(占用空间)两个概念来描述性能问题,二者统称为复杂度。
  4. 复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。

一、时间复杂度

算法的时间复杂度,也就是算法的时间量度。

时间复杂度表示算法运行时间的相对大小,是算法运行时间的增长率。特指在解决问题的规模(问题大小)趋于无穷大时,算法的运行时间与规模的关系。

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

举例:

当规模增长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. 对函数进行简化,只保留最高阶项 (忽略常数、低阶项、及高阶系数等)

下面我们分别来举例说明

常数阶
时间复杂度为 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)

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

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

相关文章

LayUI前框框架普及版

LayUI 一、课程目标 1. 【了解】LayUI框架 2. 【理解】LayUI基础使用 3. 【掌握】LayUI页面元素 4. 【掌握】LayUI内置模块二、LayUI基本使用 2.1 概念 layui&#xff08;谐音&#xff1a;类UI) 是一款采用自身模块规范编写的前端 UI 框架&#xff0…

Nginx+Tomcat 负载均衡、动静分离

目录 一、Nginx代理服务器概念 1.正向代理 2.反向代理 二、动静分离 三、负载均衡 四、Nginx七层代理实验 1.部署Nginx服务 2. 部署Tomcat服务 2.1在192.168.88.50 虚拟机上部署双实例 2.2在192.168.88.60 上部署Tomcat服务器3 3.动静分离配置 3.1Tomcat1 server 配…

RecyclerView的回收缓存均由内部类Recycler完成

1. RecyclerView的三级缓存 通常在RecyclerView中存在着四级缓存&#xff0c;从低到高分别为&#xff1a; 可直接重复使用的临时缓存&#xff08;mAttachedScrap/mChangedScrap&#xff09; mAttachedScrap中缓存的是屏幕中可见范围的ViewHoldermChangedScrap只能在预布局状态…

Material—— 常用材质节点

目录 Coordinates Absolute World Position Actor Position Object Position Utility SphereMask Coordinates 表示坐标类的节点&#xff1b; Absolute World Position 别名为WorldPosition&#xff0c;此节点输出当前像素在世界空间内的位置&#xff1b;常用于查找相机到…

作为过来人:有什么话想对当年高考前的自己说

目录 引言千人千面-有什么话想对当年高考前的自己说怀念高中&#xff0c;数学太难多考一分&#xff0c;人生就会不一样一定要勇敢&#xff0c;不止高考别把高考不当回事6的我没话说想到啥就去做别选**大学/专业强烈想出名的拖鞋哥英语全选C&#xff0c;理综要细心会的全做对当时…

Spring - 注解开发

文章目录 Spring的注解开发一、Bean 基本注解开发1.1 Component Bean的配置1.2 其他注解配置Bean1.3 Component 衍生注解 二、Bean依赖注入注解开发2.1 Value2.2 Autowired2.3 Qualifier2.4 Resource 三、非自定义注解开发3.1 无参非自定义注解开发3.2 有参非自定义注解开发 四…

Domino 14新内核

大家好&#xff0c;才是真的好。 还记得去年&#xff0c;我们不断跟进而放出的Notes/Domino产品路线图吗&#xff1f;是的&#xff0c;HCL正在按照产品路线图稳步推进&#xff0c;而很多人提出的idea&#xff0c;也逐步加入到产品中&#xff0c;等会我们也会聊到。 我最喜欢这…

MySQL安装-Linux版

MySQL-Linux版安装 1、准备一台Linux服务器 云服务器或者虚拟机都可以&#xff1b; Linux的版本为 CentOS7&#xff1b; 2、 下载Linux版MySQL安装包 下载地址 3、上传MySQL安装包 使用FinalShell软件上传即可&#xff01; 4、 创建目录,并解压 mkdir mysqltar -xvf my…

【Web服务器】Nginx网站服务

文章目录 一、Nginx 概述1.什么是 Nginx2.Nginx 的特点3.Nginx 应用场景 二、Nginx 服务基础1.编译安装 Nginx 服务1.1 布置环境1.2 安装依赖包1.3 创建运行用户、组1.4 编译安装 2.Nginx 的运行控制2.1 检查配置文件2.2 启动、停止 Nginx2.3 日志分割以及升级 Nginx 服务2.4 添…

调用腾讯API实现图片滤镜

目录 1. 作者介绍2. 图像滤波介绍3. 实验过程及结果&#xff08;附完整代码&#xff09;3.1 准备工作3.2 实验代码3.3 实验结果 1. 作者介绍 班梦威&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生 研究方向&#xff1a;模式识别与人工智能 电子…

企业如何有效制定企业信息化发展规划?(附信息化模板)

如何有效制定企业信息化发展规划&#xff1f;企业信息化发展规划是一个宏大而又复杂的命题&#xff0c;这篇来掰开揉碎讲一下企业应该如何有效制定信息化发展规划。 这里不给大家灌鸡汤&#xff0c;也不给大家画大饼&#xff0c;就说些实在的。 如果你想找经验方法&#xff0…

Lambda表达式与函数式编程

文章目录 函数式编程——Stream流概述为什么学?函数式编程思想 Lambda表达式概述Lambda表达式的前身省略规则 Stream流概述案例数据准备创建流中间操作终结操作reduce归并注意事项 Optional概述创建对象安全消费值获取值安全获取值过滤数据转换 函数式接口常用的默认方法 方法…

APPSCAN扫描https协议的网站证书安装过程(Googel浏览器)

【1】首先打开我们的appscan,点击外部设备。 【2】点击记录代理配置 【3】弹出选项后&#xff0c;在记录代理下我们可以看到AppScan SSL证书&#xff0c;这点我们点击导出 【4】这里你选择一个合适的位置&#xff0c;点击保存 【5】保存后的文件是一个zip压缩包&#xff0c;…

GPT4和Claude100k测试使用

总述 程序员们通常使用大量代码&#xff0c;找到一个能够使用Claude100k和GPT4的&#xff0c;长代码优化有希望啦&#xff01; Liaobots&#xff1a;支持GPT4和Claude100k 不定期供应GPT4 32k&#xff0c;支持最多24000字符请求 大家有时候会觉得GPT4 8k不够用&#xff0c;…

TensorFlow入门知识

个人理解 TensorFlow是集齐了很多深度学习相关的算法的框架&#xff0c;你可以利用他搭建自己的神经网络模型。对于开发者来说&#xff0c;告诉TensorFlow一批特征数据和最终的答案数据&#xff0c;让其通过一个神经网络模型进行训练&#xff0c;最终输出模型。模型将应用于应…

DSP-OMAPL-138 RTOS开发(1)——报错总结

1 git的作用 第一个问题&#xff0c;也不算错误&#xff1a;工程文件会有一个名称会有一个横着的箭头并且文件名前面都有问好&#xff0c;不算错误&#xff08;算个发现&#xff09;&#xff0c;但是发现将git文件删去即可&#xff0c;如果没有&#xff0c;右击工程文件->选…

用逆向思维学习技术

tip: 作为程序员一定学习编程之道&#xff0c;一定要对代码的编写有追求&#xff0c;不能实现就完事了。我们应该让自己写的代码更加优雅&#xff0c;即使这会费时费力。 推荐&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; 前言 学习任何知识&#xff0c…

新Ubuntu怎么装Nidia驱动,cuda和cudnn

怎么安装nvidia驱动 软件更新->附加驱动 选择一个喜欢的 或者找推荐的 Ubuntu 20.04安装CUDA & CUDNN 手把手带你撸_ubuntu20.04 无图形化安装cuda_哈希Map的博客-CSDN博客 sudo ubuntu-drivers autoinstall 怎么安装cuda gcc 不用降级 &#xff08;我没降级就安装好…

设计模式-02.经典设计原则-第二节[必读]

设计模式经典设计原则-第二节 依赖反转原则&#xff08;DIP&#xff09; 关于 SOLID 原则&#xff0c;我们已经学过单一职责、开闭、里式替换、接口隔离这四个原则。今天&#xff0c;我们再来学习最后一个原则&#xff1a;依赖反转原则。在前面&#xff0c;我们讲到&#xff…

C++ 深入理解多态及拓展

文章目录 1. 理解虚表1.1 虚表1.2 验证1.3 子类虚表1.4 相同类不同对象的虚表 2. 静态绑定和动态绑定2.1 静态绑定2.2 动态绑定 3. 多态的实现原理3.1 向上转型3.2 多继承3.3 原理 4. 拓展4.1 构造函数能不能是虚函数4.2 父类和子类的析构函数在底层的命名问题4.3 对象之间无法…