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

news2024/11/17 13:22:03

概览

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

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

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

  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/634392.html

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

相关文章

合金氢化物动力学与瞬时流量

在经典的合金氢化物动力学描述中&#xff0c;有一种是用JMAK方程来描述和拟合合金的吸放氢过程&#xff0c;方程很简洁&#xff1a;&#xff0c;其中是反应程度或者百分比&#xff0c;表示合金氢化物吸氢或者放氢的程度&#xff0c;是该合金吸氢或放氢的一种特征常数&#xff0…

使用wab2app将网页打包成APK

前言 通过开源项目ChatGPT-Next-Web部署完了私人网页ChatGPT&#xff0c;为了使访问更加便捷&#xff0c;便想着使用wab2app打包为APK&#xff0c;虽然最终达成了效果&#xff0c;可一路走来遇到了很多坑儿&#xff0c;记录下 打包流程 有要打包的网站和软件HBuilder X&…

【Kubernetes存储篇】持久化存储PV、PVC详解

文章目录 一、PV、PVC持久化存储理论1、PV、PVC是什么&#xff1f;2、PV的供应方式3、PV、PVC的回收策略 二、案例&#xff1a;PV、PVC持久化存储案例演示1、搭建NFS服务端2、创建PV&#xff0c;并使用NFS共享存储3、创建PVC&#xff0c;并和PV绑定4、创建Pod&#xff0c;并挂载…

docker中运行PostgreSQL容器

我们如何在docker中运行postgresql容器&#xff0c;要进过如下几个步骤就可以了。 拉取postgresql容器 docker pull postgres:latest使用上述命令将从 Docker Hub 存储库中提取最新可用版本的 PostgreSQL。 从 PostgreSQL 服务器 Docker 镜像运行容器 在部署之前&#xff0c;…

2023年6月DAMA-CDGA/CDGP数据治理工程师认证报名特惠

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

WinDbg安装入坑3(C#)

由于作者水平有限&#xff0c;如有写得不对的地方&#xff0c;请指正。 使用WinDbg的过程中&#xff0c;坑特别的多&#xff0c;对版本要求比较严格&#xff0c;如&#xff1a; 1 32位应用程序导出的Dump文件要用32位的WinDbg打开&#xff0c;想要没有那么多的问题&#xf…

Xcode 15 beta (15A5160n) - Apple 平台 IDE

Xcode 15 beta (15A5160n) - Apple 平台 IDE IDE for iOS/iPadOS/macOS/watchOS/tvOS/visonOS 请访问原文链接&#xff1a;https://sysin.org/blog/apple-xcode-14/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Xcode 15 使…

windows系统cmd命令设置别名,并添加到环境变量

众所周知&#xff0c;Linux 命令很强大&#xff0c;使用起来也很方便&#xff0c;但是想在 windows 系统上使用 Linux 命令有些困难&#xff0c;要么下载第三方终端工具&#xff0c;要么就是安装一系列命令环境。 作为一个前端开发&#xff0c;其实可以全局安装一下 npm 命令行…

分库分表-ShardingSphere

分库分表拆常见分方法与特点 分片策略 数据分布 以后扩展 基于Hash&#xff1a;hash(分片键)%分片数 数据分布均匀 不易扩容&#xff0c;扩容需要数据迁移 范围分片&#xff1a;例如按年分&#xff0c;按月&#xff0c;按日 数据分表可能不均匀 易扩展&#xff0c;扩展…

API自动化测试利器Postman,帮助你更好地进行 API 自动化测试

目录 前言&#xff1a; 一、基本功能 二、测试工具 三、示例 前言&#xff1a; Postman 是一个易于使用的 API 开发和测试工具&#xff0c;可以在其中快速构建、测试和文档化 Web API。Postman 提供了一个直观的用户界面&#xff0c;可以轻松地创建 HTTP 请求、测试响应、…

深入解析XMLHttpRequest:实现异步通信的利器

文章目录 介绍什么是XMLHttpRequest&#xff1f;XMLHttpRequest的基本用法1.创建XMLHttpRequest对象2.配置请求3.发送请求 XMLHttpRequest 属性sendreadyStatestatusstatusTextresponseresponseTextresponseTyperesponseURLtimeoutwithCredentials 异步请求与同步请求请求类型和…

淡季,老手买入的季节。

刚在刷抖音&#xff0c;刷到马云的视频。心里在想&#xff1a;这么大的企业家大富豪怎么会哽咽呢&#xff1f;他缺钱吗&#xff1f;他需要为生存奋斗吗&#xff1f; 他当然不缺钱&#xff0c;也不需要为生存去奋斗。如果以家庭生活支出来算&#xff0c;他的钱够几代儿孙挥霍了。…

漂亮国因一颗气球而疯狂给质量团队带来的启示

最近漂亮国因为我国的一颗漂洋过海的淘气的民用气球而疯狂。这颗气球成功躲过了号称全球最先进的防空系统&#xff0c;跨越大半个漂亮国&#xff0c;直到被一居民拍照无意间发现&#xff0c;漂亮国才反应过来。多次派战斗机拦截无果&#xff0c;在气球降到15km后&#xff0c;F2…

数据链路层之以太网协议基本知识总结分享

目录 1. 以太网协议报文格式 2. MTU是什么?它对哪些协议有影响? 1. 以太网协议报文格式 这里的目的地址不是ip地址,是Mac地址,mac地址是6个字节,比ipv4地址大了2个字节,当前的mac地址是可以让每个设备都是唯一的,且不需要动态分配,一般是网卡出厂就分配好了的.这就代表我们…

【他山之石】基于Echarts表格的时间线(轴)组件触发时间变化事件,带多种方案比较

【他山之石】基于Echarts表格的时间线组件触发时间变化事件 1 背景2 调整思路3 函数监听 1 背景 在开发中遇到一个场景&#xff1a;要展示的数据随着时间的变化发生改变&#xff0c;有以下几点要求的的时间线。 水平方向可以切换时间变化&#xff0c;带播放按钮时间节点背景图…

chatgpt赋能python:Python编程:如何删除前面的代码?

Python编程&#xff1a;如何删除前面的代码&#xff1f; 在Python编程中&#xff0c;我们有时会需要删除之前写的一些代码&#xff0c;以便更好地组织我们的代码结构和逻辑。那么&#xff0c;Python中如何删除前面的代码呢&#xff1f;在本文章中&#xff0c;我们将为您详细介…

python字符串格式化通过占位符拼接

我之前写了python字符串拼接 但我们会发现 它不太好用 第一个 当变量很多的时候 会写的很长 第二个 是python中字符串不能直接和其他类型的变量拼接 字符串格式化 也属于是字符串拼接的一种方法 语法上不是使用加号 我们打开编辑器 编写代码如下 weight 8.70; age 2; name…

Nvidia AGX Orin MAX9296 /MAX9295驱动寄存器配置

MAX9295 配置说明 1.Max9295 的功能及应用 MAX9295 是把 MIPI CSI-2 转化成 GMSL2 或者 GMSL1 信号&#xff0c;该信号是可以通过 15m 长的线缆发送或接受控制数据以及传递 video 数据和双向的控制数据。 GMSL2 有固定的速率&#xff0c;正向的速率为 3Gbps 或者 6Gbps &…

SpringBoot整合Flyway实现数据库的初始化和版本管理

文章目录 一、Flyway1、介绍2、业务痛点3、个人理解 二、SpringBoot整合flyway1、整合2、SQL文件命名3、版本号校验算法4、工作流程5、注意事项 一、Flyway 1、介绍 Flyway 是一款开源的数据库版本管理工具。它可以很方便的在命令行中使用&#xff0c;或者在Java应用程序中引入…

win10无法使用浏览器上网问题总结贴(附带解决办法)

现象 电脑连接WIFI之后&#xff0c;可以登录微信但是一直打不开网页&#xff0c;其它软件也无法联网。 解决办法 重启大法 遇到这种问题通常最简单有效的办法就是&#xff0c;重启电脑&#xff0c;然而在我重启完成之后还是这样无法使用浏览器上网疑难解答 使用win10的疑难解…