算法效率的度量(下):空间复杂度与递归栈
一、空间复杂度衡量什么空间复杂度衡量的是算法执行过程中额外申请的内存空间不包括输入数据本身占用的空间。我们关注的是当数据规模 N 增大时额外内存是否随之增长。二、O(1)固定额外空间如果算法只使用了固定数量的变量无论 N 多大内存占用都不变就是 O(1)。#include stdio.h /* * 功能查找数组中的最大值 * 空间复杂度O(1) * * 只使用了 maxVal 和 i 两个变量 * 没有申请与 N 相关的额外空间 */ int findMax(int arr[], int N) { int maxVal arr[0]; // 固定变量1 for (int i 1; i N; i) { // 固定变量2 if (arr[i] maxVal) { maxVal arr[i]; } } return maxVal; }三、O(N)额外数组空间当算法需要创建一个与输入规模 N 相当的新数组来存储中间结果时空间复杂度为 O(N)。#include stdio.h /* * 功能复制数组并反转 * 空间复杂度O(N) * * 创建了一个长度为 N 的辅助数组 helper * 额外空间随 N 线性增长 */ void reverseCopy(int arr[], int N) { int helper[N]; // 额外申请 N 个空间 for (int i 0; i N; i) { helper[i] arr[N - 1 - i]; } for (int i 0; i N; i) { printf(%d , helper[i]); } printf(\n); }四、递归的栈空间重点递归函数的空间复杂度不是看代码里定义了几个变量而是看递归调用栈的深度。每次递归调用系统都会在内存栈中创建一个栈帧来保存局部变量和返回地址。4.1 递归深度为 N每次减1#include stdio.h /* * 功能递归递减演示 O(N) 空间复杂度 * * 递归过程 * recurse(4) - recurse(3) - recurse(2) - recurse(1) * * 每一层递归都会占用一个栈帧同时存在的栈帧最多有 N 个 * 因此空间复杂度为 O(N) */ void recurseDown(int N) { if (N 1) { printf(到达底部\n); return; } int local N; // 局部变量存在当前栈帧中 printf(递归层 N%d\n, N); recurseDown(N - 1); // 每次减1深度为 N } int main() { recurseDown(4); return 0; }内存中的栈帧分布以 N4 为例栈顶 | recurse(1) | - 最先创建最后释放 | recurse(2) | | recurse(3) | 栈底 | recurse(4) | - 最后创建最先释放同时存在的栈帧有 4 个即 N 个。4.2 递归深度为 log N每次减半#include stdio.h /* * 功能递归折半演示 O(log N) 空间复杂度 * * 递归过程 * recurse(16) - recurse(8) - recurse(4) - recurse(2) - recurse(1) * * 深度为 log₂N同时最多只存在 log N 个栈帧 * 因此空间复杂度为 O(log N) */ void recurseHalve(int N) { if (N 1) { printf(到达底部\n); return; } int local N; printf(递归层 N%d\n, N); recurseHalve(N / 2); // 每次规模减半深度为 log N } int main() { recurseHalve(16); // 深度为 4 (16-8-4-2-1) return 0; }4.3 二分查找的递归版本#include stdio.h /* * 功能递归版二分查找 * 时间复杂度O(log N) * 空间复杂度O(log N) - 注意这里 * * 虽然代码里只有 left, right, mid 三个变量 * 但递归深度为 log N每层栈帧都要保存这些变量 * 因此总空间复杂度由递归深度决定 */ int binarySearchRec(int arr[], int left, int right, int target) { if (left right) { return -1; // 没找到 } int mid left (right - left) / 2; if (arr[mid] target) { return mid; } else if (arr[mid] target) { return binarySearchRec(arr, mid 1, right, target); } else { return binarySearchRec(arr, left, mid - 1, target); } }五、时间与空间的本质区别理解空间复杂度时必须牢记一个关键区别时间不能复用第一次循环花了 10ms第二次循环又花 10ms总时间是累加的。空间可以复用第一层递归的栈帧在函数返回后就被销毁了这块内存可以留给后面的递归层使用。因此空间复杂度只看同时存在的最大空间不是累计申请的空间。六、快速判断口诀代码特征空间复杂度判断要点固定数量的局部变量O(1)与 N 无关长度为 N 的辅助数组O(N)额外数组大小递归每次规模减1O(N)递归深度 N递归每次规模减半O(log N)递归深度 log N递归深度 log N 每层固定数组O(log N)空间可复用看最大同时占用七、练习题题目1void s1(int N) { int a, b, c; for (int i 0; i N; i) { a i; } }空间复杂度是多少题目2void s2(int N) { int temp[N]; // 额外数组 for (int i 0; i N; i) { temp[i] i; } }空间复杂度是多少题目3void s3(int N) { if (N 1) return; s3(N - 1); }空间复杂度是多少题目4void s4(int N) { if (N 1) return; s4(N / 2); }空间复杂度是多少题目5void s5(int N) { if (N 1) return; int arr[100]; // 固定大小100的数组 s5(N / 2); }空间复杂度是多少注意每层都有 arr[100]但空间可复用答案与解析题号空间复杂度解析1O(1)只有固定变量 a, b, c, i2O(N)申请了长度为 N 的辅助数组3O(N)递归深度为 N每次减14O(log N)递归深度为 log N每次减半5O(log N)递归深度为 log N。虽然每层有 arr[100]但栈帧是先后使用的不是同时存在最大同时空间为 100 × log N即 O(log N)

相关新闻

柔性生产系统技术解析:人形机器人如何实现换型换线与自适应工艺执行

柔性生产系统技术解析:人形机器人如何实现换型换线与自适应工艺执行

一、为什么刚性生产正在失效?传统刚性制造系统(Rigid Manufacturing System, RMS)的架构设计遵循"专用化"原则:特定的机械结构、固化的控制逻辑、预定义的工艺参数,所有设计决策都指向单一目标——在既定产品…

2026/8/26 18:09:44 阅读更多 →
XAML Border 控件完全教程

XAML Border 控件完全教程

一、Border 是什么在 WPF、.NET MAUI、Xamarin.Forms、UWP、WinUI 等 XAML 技术栈中&#xff0c;Border 是一个装饰性布局容器。它的核心职责只有一个&#xff1a;给单个子元素添加边框、背景、圆角和内边距等视觉装饰。二、最基础的用法 <Border Background"Li…

2026/8/26 18:09:44 阅读更多 →
涌现现象模拟

涌现现象模拟

>涌现现象1. 没有总控制器&#xff1a;没有代码直接指挥群体怎么流动、怎么编队&#xff1b;2. 每个个体只有 3 条极简局部规则&#xff1a;a.向同伴平均位置靠近b.和离得太近的个体保持距离c.和周围同伴运动方向对齐涌现结果&#xff1a;大量小球自发形成群组、分流、盘旋&…

2026/8/26 18:09:44 阅读更多 →

最新新闻

手把手教还是戴VR眼镜?一文看懂人形机器人“数据喂养”的四大流派

手把手教还是戴VR眼镜?一文看懂人形机器人“数据喂养”的四大流派

面对千万小时级的数据饥荒&#xff0c;整个行业都在疯狂寻找破局之道。目前&#xff0c;获取机器人训练数据的路线主要有四条&#xff0c;它们就像武侠小说中的四大门派&#xff0c;各有各的绝招&#xff0c;也各有各的致命弱点。第一派是“遥操作”&#xff0c;也就是“手把手…

2026/8/26 18:47:25 阅读更多 →
2026年电钢琴选购避坑指南:6款高性价比机型实测拆解,从千元到万元怎么选?

2026年电钢琴选购避坑指南:6款高性价比机型实测拆解,从千元到万元怎么选?

教琴这些年&#xff0c;被问得最多的问题就是&#xff1a;"老师&#xff0c;电钢琴到底怎么选&#xff1f;"说实话&#xff0c;这个问题之所以让人头疼&#xff0c;不是因为电钢琴本身有多复杂&#xff0c;而是因为市面上的信息太杂了。有人推荐你买几百块的电子琴凑…

2026/8/26 18:47:25 阅读更多 →
LCR 173:在点名(二分查找) —— 题解

LCR 173:在点名(二分查找) —— 题解

&#x1f44b; 欢迎阅读 &#x1f3af; 欢迎来到「点名」题解之旅&#xff01; 本文将带你从"点名时发现学号缺了一个"这一直观场景出发&#xff0c;深入理解二段性二分的巧妙运用&#xff0c;并掌握如何比较元素与下标是否相等来定位缺失的学号。 在开始之前&#…

2026/8/26 18:47:25 阅读更多 →
标尺在手,定量不愁:从土壤到肠道,绝对定量微生物一测到底

标尺在手,定量不愁:从土壤到肠道,绝对定量微生物一测到底

为什么你的菌群数据可能“骗”了你&#xff1f;在微生物组研究中&#xff0c;扩增子与宏基因组测序虽可解析菌群结构&#xff0c;却受限于相对丰度数据&#xff0c;难以区分真实丰度变化与比例偏移。引入绝对定量校正&#xff08;如Spike-in内标&#xff09;&#xff0c;可精准…

2026/8/26 18:47:25 阅读更多 →
上线千舟报修云前后,景洪市民族中学后勤工作发生了什么?

上线千舟报修云前后,景洪市民族中学后勤工作发生了什么?

景洪市民族中学为边疆地区公办民族中学&#xff0c;涵盖教学楼、多民族学生公寓、食堂、运动场地&#xff0c;学生民族构成多元&#xff0c;宿舍、教学设施报修分散&#xff0c;选用千舟报修云作为校园报修系统首选&#xff0c;推进智慧后勤建设。 改造前&#xff1a;传统后勤报…

2026/8/26 18:47:25 阅读更多 →
深入理解 AI Agent · AGENT #03:从单 Agent 到多 Agent

深入理解 AI Agent · AGENT #03:从单 Agent 到多 Agent

&#x1f4d8; 《深入理解 AI Agent》系列 第八篇 | AGENT-03 前篇回顾&#xff1a;Agent 基础篇 #01 从LLM到Agent → Agent 基础篇 #02 四大核心机制 → Agent 基础篇 #03 从单Agent到多Agent 开篇&#xff1a;单 Agent 能走多远&#xff1f; 做 AI Agent 的开发者常有一个…

2026/8/26 18:46:25 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要&#xff1a; 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数&#xff08;random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录&#xff1a; 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中&#xff0c;主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段&#xff0c;转入了政务服务的常态化落地应用&#xff1b;在实际使用过程中&#xff0c;它能自主理解办事需求、辅助完成填报申报、开展材料预审&#xff0c;并联动多个系统协同作业&#xff0c;真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态&#xff0c;宏观上观察到的光是由无数个微观的光量子组成的&#xff0c;每个光子在产生的瞬间&#xff0c;其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前&#xff0c;在微观层面&#xff0c;每个光量子的运动轨迹是以波函数所展现…

2026/8/26 14:45:33 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”&#xff0c;而是SIP会话的动态重定向你有没有遇到过这样的场景&#xff1a;客服坐席A正在和客户通电话&#xff0c;突然需要把这通对话无缝转给专家坐席B&#xff0c;客户完全感知不到中间的断连——既没听到忙音&#xff0c;也没被要求重新拨号…

2026/8/26 17:46:43 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack&#xff1f;如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法&#xff0c;那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/26 14:46:37 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速&#xff1a;macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南&#xff1a;3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗&#xff1f;ncmdump解密工具帮你轻松解决这个困…

2026/8/26 17:46:39 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片&#xff1a;为英语学习 App 打造桌面级学习助手适用平台&#xff1a;HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0&#xff08;API 26 Beta&#xff09;新增了 AgentCard 智能体卡片能力&#xff0c;这是继 HMAF&#xff08;鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →