01-1.2.3 算法的空间复杂度

news2025/1/18 18:58:11

什么是空间复杂度?

代码在运行之前需要先装入内存,程序代码需要占一定的位置(在这边假设是100B)
定义的变量和参数in都需要占用内存空间

//算法一——逐步递增型
void loveYou(int n) {  //n为问题规模
	int i = 1;  //爱你的程度
	while(i <= n){
		i++;  //每次+1
		printf("I Love You %d\n", i);
	}
	printf("I Love You More Than %d\n", n);
}

int main(){
	loveYou(3000);
}

在这里插入图片描述

不难发现,无论问题规模怎么变,算法运行所需要的内存空间都是固定常量,算法的空间复杂度表示为:
S ( n ) = O ( 1 ) S(n)=O(1) S(n)=O(1)

注:S表示Space

算法原地工作——指的是:算法所需内存空间为常量

void test(int n){
	int flag[n];  //声明一个长度为n的数组
	int i;
	//...此处省略很多代码
}

假设一个int变量占4B,则所需内存空间= 4 + 4n + 4 = 4n + 8
S ( n ) = O ( 4 n + 8 ) = O ( n ) S(n)=O(4n+8)=O(n) S(n)=O(4n+8)=O(n)


void test(int n){
	int flag[n][n];  //声明一个n*n的数组
	int i;
	//...此处省略很多代码
}

S ( n ) = O ( n 2 ) S(n)=O(n^2) S(n)=O(n2)


void test(int n){
	int flag[n][n];  //声明一个n*n的二维数组
	int other[n];  //声明一个长度为n的数组
	int i;
	//...此处省略很多代码
}

S ( n ) = O ( n 2 ) + O ( n ) + o ( 1 ) = O ( n 2 ) S(n)=O(n^2)+O(n)+o(1)=O(n^2) S(n)=O(n2)+O(n)+o(1)=O(n2)

函数递归调用带来的内存开销

void loveYou(int n){  //n为问题规模
	int a,b,c;  //声明一系列局部变量
	//...省略代码
	if(n>1){
		loveYou(n-1);
	}
	printf("I Love You %d\n", i);
}

int main(){
	loveYou(5);
}

最终运行的结果:
在这里插入图片描述

代码运行过程分析

首先是程序代码,大小固定,与问题规模无关
其次是存储函数的参数n,局部变量a, b, c

  • n=5,要声明变量a, b, c
  • n= 4,要声明变量a, b, c
  • ……
    具体实现过程如图所示:
    在这里插入图片描述

在最后loveYou(1)执行时,发现不满足n>1的条件,计算机会在内存中返回n=2,也就是loveYou(2)时的状态
如下图所示:
在这里插入图片描述

void loveYou(int n){
	int flag[n];  //声明一个长度为n的数组
	//...省略部分代码
	if(n>1){
		loveYou(n-1);
	}
	printf("I Love You %d\n", i);
}

int main(){
	 loveYou(5);
}

由于定义的是一个数组,并且长度为n,所以每次根据传入参数的不同,数组的长度,即占用的内存空间,是不一样的
内存空间如图所示:
在这里插入图片描述

不难发现,第1级的调用数组长度为1,第2级的为2,第3级的为3……
所以各级的空间大小总共为:
1 + 2 + 3 + . . . + n = [ n ( 1 + n ) ] 2 = 1 2 n 2 + 1 2 n 1+2+3+...+n=\frac{[n(1+n)]}{2}=\frac{1}{2}n^2+\frac{1}{2}n 1+2+3+...+n=2[n(1+n)]=21n2+21n
所以空间复杂度为:
S ( n ) = O ( n 2 ) S(n)=O(n^2) S(n)=O(n2)

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

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

相关文章

Notepad++ 常用

File Edit search view Encoding Language Settings Tools Macro Run Plugins Window 文件 编辑 搜索 视图 编码 语言 设置 工具 宏 运行 插件 窗口 快捷方式 定位行 &#xff1a;CTRL g查找&#xff1a; CTRL F替换&am…

未来已来, AI将作为超级工具?

人工智能时代已来 1.AI将作为超级工具&#xff1a;AI是推动全产业数字化转型的高效工具&#xff0c;机遇比互联网时代大10倍&#xff0c;但只有1/3的机会留给初创企业。 2.硅谷AI市场分类中&#xff0c;特别看好开源平台&#xff0c;其将为初创企业和大企业提供更多选择。 3.…

LabVIEW调用外部DLL(动态链接库)

LabVIEW调用外部DLL&#xff08;动态链接库&#xff09; LabVIEW调用外部DLL&#xff08;动态链接库&#xff09;可以扩展其功能&#xff0c;使用外部库实现复杂计算、硬件控制等任务。通过调用节点&#xff08;Call Library Function Node&#xff09;配置DLL路径、函数名称和…

chatMed开发日志博客(持续更新中)

目录 1. 项目概述 2. 开发人员团队 3. 大致需求 4. 开发内容 4.1. 前端开发 4.1.1: 前端页面开发 4.1.2: 登录机制以及路由守卫的开发 4.1.3: 文件上传机制和保存机制 4.1.4: 消息传递机制 4.2. 线程池开发 4.3. 在线调试 1. 项目概述 搭建一个基于深度学习的分析平台…

Scrapy vs. Beautiful Soup | 网络抓取教程 2024

网络爬虫是任何想要从网上收集数据用于分析、研究或商业智能的人必备的技能。Python中两个最受欢迎的网络爬虫工具是Scrapy和Beautiful Soup。在本教程中&#xff0c;我们将比较这些工具&#xff0c;探索它们的功能&#xff0c;并指导你如何有效地使用它们。此外&#xff0c;我…

国产FPGA核心板!米尔紫光同创Logos-2和Xilinx Artix-7核心板

随着嵌入式的快速发展&#xff0c;在工控、通信、5G通信领域&#xff0c;FPGA以其超灵活的可编程能力&#xff0c;被越来越多的工程师选择。近日&#xff0c;米尔电子发布2款FPGA的核心板和开发板&#xff0c;型号分别为&#xff1a;基于紫光同创Logos-2系列PG2L100H的MYC-J2L1…

Linux基础指令及其作用之系统信息和管理

系统信息和管理 ps ps 命令用于显示当前系统的进程信息。它是 Unix 和类 Unix 操作系统中的一个重要工具&#xff0c;可以用于监控和管理系统进程。以下是 ps 命令的详细用法和常见选项&#xff1a; ps [选项]常用选项![在这里插入图片描述](https://img-blog.csdnimg.cn/di…

从摇一摇到弹窗,AD无处不在?为了不再受打扰,推荐几款好用的屏蔽软件,让手机电脑更清爽

当我们沉浸在智能手机带来的便捷与乐趣中时&#xff0c;内置AD如同不速之客&#xff0c;时常打断我们的体验。 尤其是手机上那些“摇一摇”跳转&#xff0c;稍有不慎就会跳转到其他应用&#xff0c;令人不胜其烦。同样&#xff0c;电脑上的内置AD也如影随形&#xff0c;影响了我…

深度学习模型的C++部署:ONNXRUNTIME引领跨平台革命

一、引言 在AI技术的浪潮中&#xff0c;深度学习模型的部署已成为工程师们的核心技能。随着AI技术的不断进步&#xff0c;对于能够高效部署模型的人才需求日益增长。C因其在性能和系统级控制方面的优势&#xff0c;正逐渐成为深度学习模型部署的行业新宠。 二、C&#xff1a;…

【介绍下运维,什么是运维?】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

【Qt】【模型-视图架构】代理模型示例

文章目录 1. 基本排序/过滤模型Basic Sort/Filter Model Example2. 自定义排序/过滤模型Custom Sort/Filter Model ExampleFilterLineEdit类定义及实现MySortFilterProxyModel类定义及实现 1. 基本排序/过滤模型Basic Sort/Filter Model Example 官方提供的基本排序/过滤模型示…

liunx文件系统与日志分析

文章目录 一、基本概念二、日志分析三、实验 一、基本概念 文件是存储在硬盘上的&#xff0c;硬盘上的最小存储单位是扇区每个扇区大小事512字节 inode&#xff1a;元信息&#xff08;文件的属性 权限 创建者 创建日期&#xff09; block&#xff1a;块 连续八个扇区组成一块…

Selenium Server 中 Standalone 模式|实现分布式测试、远程驱动浏览器

实现分布式测试|远程驱动浏览器 Selenium Server 介绍主要功能 Standalone 模式概括Standalone 模式分布式测试的应用 Selenium Server 介绍 Selenium Server 是 Selenium 自动化测试框架的核心组件之一&#xff0c;负责管理和控制浏览器,为测试脚本提供底层支持 主要功能 浏…

麒麟系统 安装xrdp 远程桌面方法记录

一、安装环境 麒麟V10 2107 ft2000 麒麟V10 2107 x86_64 二、安装准备 使用《Kylin-Desktop-V10-Release-2107-arm64.iso》镜像 做好U盘启动系统后&#xff0c;需要安装一个远程桌面工具&#xff0c;可以多用户在windows上使用远程桌面访问麒麟系统。 目前在linux系统上较…

Conditional DETR解读---带anchor的DETR

DETR存在的问题 1.收敛速度慢 2.对小目标物体检测效果不好&#xff0c;因为transformer计算量大&#xff0c;受限于计算规模&#xff0c;CNN提取特征时只采取了最后一层特征&#xff0c;没有用FPN等结构。所以对于小目标检测效果不好。 论文主要观点 通过对DETRdecoder中的a…

Java—— StringBuilder 和 StringBuffer

1.介绍 由于String的不可更改特性&#xff0c;为了方便字符串的修改&#xff0c;Java中又提供了StringBuilder和Stringbuffer类&#xff0c;这两个类大部分功能是相同的&#xff0c;以下为常用方法&#xff1a; public static void main(String[] args) {StringBuilder sb1 n…

乡村振兴与乡村旅游创新:创新乡村旅游产品,提升旅游服务水平,打造特色乡村旅游品牌,助力美丽乡村建设

目录 一、引言 二、乡村旅游产品的创新 &#xff08;一&#xff09;挖掘乡村特色资源 &#xff08;二&#xff09;注重产品体验性 &#xff08;三&#xff09;创新旅游产品形态 三、旅游服务水平的提升 &#xff08;一&#xff09;加强基础设施建设 &#xff08;二&…

微信小程序-页面导航-导航传参

1.声明式导航传参 navigator组件的url属性用来指定将要跳转到的页面的路径&#xff0c;同时&#xff0c;路径的后面还可以携带参数&#xff1a; &#xff08;1&#xff09;参数与路径之间使用 ? 分割 &#xff08;2&#xff09;参数键与参数值用 相连 &#xff08;3&…

《SpringBoot3+Vue3实战》系列文章目录

前后端分离&#xff08;Frontend-Backend Separation&#xff09;是一种软件架构设计模式&#xff0c;它将传统的Web应用中的前端&#xff08;用户界面&#xff09;和后端&#xff08;服务器逻辑和数据存储&#xff09;从应用层面进行解耦&#xff0c;使得两者可以独立地开发、…

conda与pip的镜像源与代理设置

conda与pip的镜像源与代理设置 一、前言二、conda镜像源设置2.1conda默认镜像源介绍2.2通过终端设置镜像源2.3通过配置文件设置镜像源 三、pip镜像源设置3.1pip默认镜像源介绍3.2通过终端临时设置镜像源3.3通过配置文件设置一个或多个镜像源 四、conda代理设置4.1通过终端设置代…