空间复杂度的相关概念

1. 空间复杂度

空间复杂度(space complexity)用于衡量算法占用内存空间随着数据量变大时的增长趋势。

统计哪些空间:
在这里插入图片描述

暂存数据:用于保存算法运行过程中的各种常量、变量、对象等。
栈帧空间:用于保存调用函数的上下文数据。系统在每次调用函数时都会在栈顶部创建一个栈帧,函数返回后,栈帧空间会被释放。
指令空间:用于保存编译后的程序指令,在实际统计中通常忽略不计。

而与时间复杂度不同的是,我们通常只关注最差空间复杂度。这是因为内存空间是一项硬性要求,我们必须确保在所有输入数据下都有足够的内存空间预留。

2. 如何推算

最差空间复杂度中的“最差”有两层含义:
以最差输入数据为准:当 n<10 时,空间复杂度为 O(1) ;但当 n>10 时,初始化的数组 nums 占用 O(n) 空间,因此最差空间复杂度为 O(n) 。

function algorithm(n) {const a = 0;                   // O(1)const b = new Array(10000);    // O(1)if (n > 10) {const nums = new Array(n); // O(n)}
}

以算法运行中的峰值内存为准:例如,程序在执行最后一行之前,占用 O(1) 空间;当初始化数组 nums 时,程序占用 O(n) 空间,因此最差空间复杂度为 O(n) 。

function constFunc() {// 执行某些操作return 0;
}
/* 循环的空间复杂度为 O(1) */
function loop(n) {for (let i = 0; i < n; i++) {constFunc();}
}
/* 递归的空间复杂度为 O(n) */
function recur(n) {if (n === 1) return;return recur(n - 1);
}

在循环中每轮调用函数,会返回并释放掉栈帧空间,因此只会占用 O ( 1 ) O(1) O(1)的栈帧空间。
而在递归运行中会同时存在多个未返回的函数,所以会占用 O ( n ) O(n) O(n)的栈帧空间

3. 常见类型

在这里插入图片描述
在这里插入图片描述

注意:该图展示的是空间复杂度,其反映的是增长趋势,而不是占用空间的绝对大小。

3.1 常数阶O(1)

常数阶常见于数量与输入数据大小 n 无关的常量、变量、对象。
需要注意的是,在循环中初始化变量或调用函数而占用的内存,在进入下一循环后就会被释放,因此不会累积占用空间,空间复杂度仍为 O ( 1 ) O(1) O(1)

/* 函数 */
function constFunc() {// 执行某些操作return 0;
}/* 常数阶 */
function constant(n) {// 常量、变量、对象占用 O(1) 空间const a = 0;const b = 0;const nums = new Array(10000);const node = new ListNode(0);// 循环中的变量占用 O(1) 空间for (let i = 0; i < n; i++) {const c = 0;}// 循环中的函数占用 O(1) 空间for (let i = 0; i < n; i++) {constFunc();}
}

3.2 线性阶 O(n)

线性阶常见于元素数量与 n 成正比的数组、链表、栈、队列等

/* 线性阶 */
function linear(n) {// 长度为 n 的数组占用 O(n) 空间const nums = new Array(n);// 长度为 n 的列表占用 O(n) 空间const nodes = [];for (let i = 0; i < n; i++) {nodes.push(new ListNode(i));}// 长度为 n 的哈希表占用 O(n) 空间const map = new Map();for (let i = 0; i < n; i++) {map.set(i, i.toString());}
}

每个部分的空间复杂度都是 O ( n ) O(n) O(n),而这些部分是独立的,不相互嵌套或共享空间。因此,整个函数的空间复杂度为各部分空间复杂度之和( 通常忽略常数系数 )
最终,该函数的空间复杂度是 O ( n ) O(n) O(n)

3.3 平方阶

平方阶常见于矩阵和图

/* 平方阶 */
function quadratic(n) {// 矩阵占用 O(n^2) 空间const numMatrix = Array(n).fill(null).map(() => Array(n).fill(null));// 二维列表占用 O(n^2) 空间const numList = [];for (let i = 0; i < n; i++) {const tmp = [];for (let j = 0; j < n; j++) {tmp.push(0);}numList.push(tmp);}
}

3.4 指数阶

指数阶常见于二叉树,层数为 n 的“满二叉树”的节点数量为 2 n − 1 2^n-1 2n1 ,占用 O ( 2 n ) O(2^n) O(2n) 空间

/* 指数阶(建立满二叉树) */
function buildTree(n) {// n为深度if (n === 0) return null;const root = new TreeNode(0);root.left = buildTree(n - 1);root.right = buildTree(n - 1);return root;
}

3.5 对数阶

对数阶常见于分治算法。例如归并排序,输入长度为 n 的数组,每轮递归将数组从中点处划分为两半,形成高度为 l o g n log^n logn 的递归树,使用) l o g 2 n log_2^n log2n栈帧空间。


🔍时间复杂度的相关概念
参考:https://www.hello-algo.com/

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

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

相关文章

火山引擎字节跳动豆包AI绘画接口

import base64 import os.pathfrom volcengine.visual.VisualService import VisualServicedef paint_dance(desc):visual_service VisualService()visual_service.set_ak(你的AK)visual_service.set_sk(你的SK)# 高美感通用V1.3-文生图form {"req_key": "hig…

鸿蒙HarmonyOS $r(““)与$rawfile(““)的区别

在鸿蒙&#xff08;HarmonyOS&#xff09;开发中&#xff0c;$r(“”) 和 $rawfile(“”) 是两种不同的资源引用方式&#xff0c;它们分别用于引用不同的资源类型。 1、$r(“”) $r 函数通常用于引用字符串、颜色、尺寸、样式等定义在资源文件&#xff08;如 strings.json, c…

keil MDK自动生成带版本bin文件

作为嵌入式单片机开发&#xff0c;在Keil MDK&#xff08;Microcontroller Development Kit&#xff09;中开发完编译完后&#xff0c;经常需要手动进行版本号添加用于发版&#xff0c;非常麻烦&#xff0c;如果是对外发行的话&#xff0c;更容易搞错&#xff0c;特此码哥提供一…

SpringCloud Alibaba Sentinel 流量控制之流控模式实践总结

官网文档&#xff1a;https://sentinelguard.io/zh-cn/docs/flow-control.html wiki地址&#xff1a;https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6 本文版本&#xff1a;spring-cloud-starter-alibaba&#xff1a;2.2.0.RELEASE 如下图所…

企业如何选择合适的CRM工具?除Salesforce之外的10大主流选择

对比salesforce&#xff0c;其他10款优秀CRM&#xff1a;纷享销客CRM、Zoho CRM、腾讯企点、销售易、企业微信 (WeCom)、Odoo CR、OroCRM、金蝶、用友CRM、EspoCRM 虽然Salesforce以其全面的功能和强大的市场占有率在海外收获了许多客户&#xff0c;但Salesforce在国内市场的接…

多环境镜像晋级/复用最佳实践

作者&#xff1a;木烟 本文主要介绍镜像构建部署场景&#xff0c;多环境镜像晋级/复用最佳实践&#xff0c;保证“所发即所测”。 场景介绍 应用研发场景有效地管理镜像产物是确保软件快速、安全、可靠部署的关键环节。通常一个应用研发需要经过测试、预发、生产各个阶段&am…

Windows下MySQL数据库定期备份SQL文件与删除历史备份文件.bat脚本

目录 一、功能需求 二、解决方案 (1)新建文件夹及批处理文件 (2)编写备份脚本 ①完整脚本 ②参数修改 (3)编写定期删除备份脚本 ①根据文件名识别日期进行删除 ② 根据文件的修改日期删除 (4)设置定时器 (5)常见报错与处理 一、功能需求 在Windows系统下…

C++使用Poco库指定网卡去接收组播数据

0x00 1、以下代码封装了一个UDP接收组播数据的类&#xff0c;第一个构造函数 Poco::Net::DatagramSocket 类可以实现UDP单播数据的接收、发送以及往组播发送数据&#xff0c;第二个构造函数使用Poco::Net::MulticastSocket类去接收组播数据&#xff0c;UdpUnit类中成员函数Rec…

minSdkVersion、targetSdkVersion、compileSdkVersion三者的作用解析

minSDK和targetSDK&#xff0c;这两者相当于一个区间。你能够用到targetSDK中最新的API和最酷的新功能&#xff0c;但又需要向后(向下)兼容到minSDK&#xff0c;保证这个区间内的设备都能够正常的执行你的APP。换句话说&#xff0c;想使用Android刚刚推出的新特性&#xff0c;但…

JAVA 注解搜索工具类与注解原理讲解(获取方法和类上所有的某个注解,父类继承的注解也支持获取)

文章目录 JAVA 注解搜索工具类与注解原理讲解&#xff08;获取方法和类上所有的某个注解&#xff0c;父类继承的注解也支持获取&#xff09;代码测试方法上加注解&#xff0c;类上不加类上加注解、方法上加注解 注解原理性能测试 JAVA 注解搜索工具类与注解原理讲解&#xff08…

音视频开发_SDL多线程

今天将向大家介绍一下SDL中的多线程的使用。通过下面对SDL 线程与锁相关的API介绍&#xff0c;你会发现&#xff0c;它与 Linux, Windows相关的API几乎是一模一样的。从这里可以推断出&#xff0c;其实SDL对于多线程的处理只是为大家提供了一套统一接口&#xff0c;并没有做其它…

汉化版PSAI全面测评,探索国产AI绘画软件的创新力量

引言 随着AI技术的飞速发展&#xff0c;图像处理和绘画领域迎来了新的变革。作为一名AIGC测评博主&#xff0c;今天我们测评的是一款国产AI绘画软件——StartAI&#xff0c;一句话总结&#xff1a;它不仅在技术上毫不逊色于国际大牌&#xff0c;更在用户体验和本地化服务上做到…

Python sorted()方法

sorted() 是Python中的一个内置函数&#xff0c;用于对可迭代对象进行排序。它返回一个新的已排序的列表&#xff0c;而不会修改原始的可迭代对象。sorted() 函数的基本语法如下&#xff1a; sorted(iterable, keyNone, reverseFalse)参数解释&#xff1a; iterable&#xff…

AI 克隆声音,只需 3 分钟(附最全教程)

作者&#xff1a;寒斜 继生成式文本大模型 Chatgpt&#xff0c;生成式图片 Stablediffusion 之后生成式语音 Text To Speech 在开源社区也出现了一匹黑马&#xff0c;就是 GPT-Sovits [ 1] 。 之所以说他是黑马&#xff0c;让人觉得惊艳&#xff0c;是因为在语音效果克隆上做…

github安全问题token和sshkeys

文章目录 sshkeys问题问题方法一:方法二:获取密钥添加密钥token问题问题:生成tokens设置tokenssshkeys问题 问题 当我们git clone代码时,会报如下错误,此时有2种解决方法。 git clone git@github.com:gjianw217/xboard-uboot.git Cloning into xboard-uboot... Permissio…

数据分析必备:一步步教你如何用matplotlib做数据可视化(6)

1、Matplotlib 网格 axes对象的grid()函数将图中网格的可见性设置为on或off。还可以显示网格的主要/次要(或两者)刻度。另外&#xff0c;可以在grid()函数中设置color&#xff0c;linestyle和linewidth属性。 参考以下示例代码 import matplotlib.pyplot as plt import numpy…

14K屏FPGA通过MIPI接口点亮

一、屏参数 屏分辨率为13320*5120&#xff0c;MIPI接口8 LANE。 二、驱动接口电路 屏偏置电压5.5V&#xff0c;逻辑供电1.8V。8 LANE MIPI&#xff0c;2 PORT。 三、MIPI DSI规范 DCS (Display Command Set)&#xff1a;DCS是一个标准化的命令集&#xff0c;用于命令模式的显…

微信公众号开发要点笔记

为了识别用户&#xff0c;每个用户针对每个公众号会产生一个安全的OpenID&#xff0c;如果需要在多公众号、移动应用之间做用户共通&#xff0c;则需前往微信开放平台&#xff0c;将这些公众号和应用绑定到一个开放平台账号下&#xff0c;绑定后&#xff0c;一个用户虽然对多个…

整理好了!2024年最常见 20 道设计模式面试题(五)

上一篇地址&#xff1a;整理好了&#xff01;2024年最常见 20 道设计模式面试题&#xff08;四&#xff09;-CSDN博客 九、什么是命令模式&#xff1f;它如何帮助实现解耦&#xff1f; 命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;它将一…

奇怪的bug

奇怪的bug 合集 1.不可见字符集问题 起因是在自己做小项目的时候&#xff0c;通过lombok的data注解&#xff0c;默认生成实体类的get set方法 但是在某个方法中获取一个属性值的时候显示找不到该属性值的get方法&#xff0c;具体直接贴图 我以为是lombok的配置问题&#xff0c…