【数据结构手札】空间复杂度详解:概念 | 习题

【数据结构手札】空间复杂度详解:概念 | 习题
在这里插入图片描述


🌈个人主页:聆风吟
🔥系列专栏:数据结构手札
🔖少年有梦不应止于心动,更要付诸行动。


文章目录

📚专栏订阅推荐

专栏名称专栏简介
C++藏宝阁本专栏聚焦学习阶段核心知识点,深耕基础与实战,干货笔记持续更新,和大家共学共进,夯实编程功底。
数据结构手札本专栏主要是我的数据结构入门学习手札,记录个人从基础到进阶的学习总结。
数据结构手札・刷题篇本专栏是《数据结构手札》配套习题讲解,通过练习相关题目加深对算法理解。

📋往期回顾:复杂度概念

算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度

时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。

📋往期回顾:大O的渐进表示法

大O符号(big O notation):是用于描述函数渐进行为的数学符号

推导大O阶方法:

  1. 用常数1取代运行时间中的所有加法常数;
  2. 在修改后的运行次数函数中,只保留最高阶项;
  3. 如果最高阶项存在且其系数不是1,则去除与这个项相乘的系数。得到的结果就是大O阶。

一. ⛳️算法的空间复杂度

算法空间复杂度的定义:

  • 空间复杂度也是一个数学表达式,是对一个算法在运行过程中额外临时占用存储空间大小的量度
  • 空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以 空间复杂度算的是变量的个数
  • 空间复杂度计算规则基本跟时间复杂度类似,也使用大O渐进表示法。
注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

二. ⛳️常见空间复杂度计算举例

1️⃣实例一

int**fun(int n){int** s =(int**)malloc(n *sizeof(int*));for(size_t i =0; i < n;++i){ s[i]=(int*)malloc((i +1)*sizeof(int));}return s;}

解析: 实例1在此处开辟的是一个二维数组,数组有n行,每行分别有1,2,3,…n列,所以是n(n + 1)/2个元素空间,空间复杂度为O(n^2)

2️⃣实例二

// 计算BubbleSort的空间复杂度?voidBubbleSort(int* a,int n){assert(a);for(size_t end = n; end >0;--end){int exchange =0;for(size_t i =1; i < end;++i){if(a[i -1]> a[i]){Swap(&a[i -1],&a[i]); exchange =1;}}if(exchange ==0)break;}}

解析: 实例2使用了常数个额外空间,分别是[ end,exchange,i ]。根据大O阶的推导方法很容易得出,BubbleSort空间复杂度为 O(1)

3️⃣实例三

// 计算Fibonacci的空间复杂度?// 返回斐波那契数列的前n项longlong*Fibonacci(size_t n){if(n ==0)returnNULL;longlong* fibArray =(longlong*)malloc((n +1)*sizeof(longlong)); fibArray[0]=0; fibArray[1]=1;for(int i =2; i <= n;++i){ fibArray[i]= fibArray[i -1]+ fibArray[i -2];}return fibArray;}

解析:实例3动态开辟了N+1个空间,根据大O阶的推导方法很容易得出,Fibonacci空间复杂度为 O(N)

4️⃣实例四

// 计算阶乘递归Fac的空间复杂度?longlongFac(size_t N){if(N ==0)return1;returnFac(N -1)* N;}

解析:实例4递归调用了N次,开辟了N个栈帧,每个栈帧使用了常数个空间。空间复杂度为O(N)

🎯递归算法的空间复杂度 = 单次递归的空间复杂度 * 递归次数
在这里插入图片描述

📝全文总结

本文系统性地讲解了算法空间复杂度的核心知识,旨在帮助读者建立一套分析算法效率的完整框架。

今天的干货分享到这里就结束啦!如果觉得文章还可以的话,希望能给个三连支持一下,聆风吟的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的最大动力!

在这里插入图片描述

Read more

【JAVA 进阶】Spring Boot 中 AOP 切面编程全解析:从基础到实战进阶

【JAVA 进阶】Spring Boot 中 AOP 切面编程全解析:从基础到实战进阶

文章目录 * 一、核心概念 * 1.1 什么是面向切面编程(AOP) * 1.2 Spring AOP 核心术语解析 * 1.3 Spring Boot 中启用 AOP 的标准配置 * 二、切点表达式深度解析与实战写法 * 2.1 基础语法与匹配规则 * 2.1.1 execution 表达式核心语法 * 2.1.2 常用通配符详解 * 2.2 基于注解的切点匹配 * 2.2.1 自定义注解驱动切点 * 2.2.2 组合切点提升复用性 * 三、通知类型深度应用与典型场景实现 * 3.1 环绕通知(@Around)

By Ne0inhk
使用 HTML + JavaScript 实现可编辑表格

使用 HTML + JavaScript 实现可编辑表格

文章目录 * 一、可编辑表格 * 二、效果演示 * 三、系统分析 * 1、页面结构 * 1.1、表格编辑区域 * 1.2、状态栏区域 * 2、核心功能实现 * 2.1定义全局变量 * 2.2渲染表格 * 2.3更新单元格数据 * 2.4键盘导航功能 * 四、扩展建议 * 五、完整代码 一、可编辑表格 可编辑表格是数据管理系统中的重要组件,它将数据展示与编辑功能融为一体,使用户能够直接在表格界面中修改数据内容。通过纯前端技术实现的可编辑表格,无需复杂的后端支持即可提供流畅的数据编辑体验,特别适用于数据录入、修改等场景。本文将介绍如何使用 HTML、CSS 和 JavaScript 实现一个可编辑表格。 二、效果演示 本系统采用简洁的三段式布局:顶部为表格标题区域,中间为主要的表格编辑区域,底部为状态栏区域。

By Ne0inhk
Spring Boot 4.0 + JDK 25 + GraalVM:下一代云原生Java应用架构

Spring Boot 4.0 + JDK 25 + GraalVM:下一代云原生Java应用架构

🧑 博主简介:ZEEKLOG博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可关注公众号 “ 心海云图 ” 微信小程序搜索“历代文学”)总架构师,16年工作经验,精通Java编程,高并发设计,分布式系统架构设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。 🤝商务合作:请搜索或扫码关注微信公众号 “ 心海云图 ” Spring Boot 4.0 + JDK 25 + GraalVM:下一代云原生Java应用架构 摘要 随着云原生架构的快速演进,传统Java应用面临的“启动慢、内存高、体积大”三座大山亟待解决。

By Ne0inhk
Java Map常用方法和实现类深度详解

Java Map常用方法和实现类深度详解

文章目录 * 前言 * 第一章 Map接口概述 * 1.1 Map的继承体系 * 1.2 Map的核心特性 * 1.3 存储结构的理解 * 第二章 HashMap:最常用的Map实现 * 2.1 底层数据结构演进 * 2.2 核心源码深度解析 * 2.2.1 重要成员变量 * 2.2.2 设计哲学解读 * 2.3 put方法执行流程 * 2.4 扩容机制(resize) * 2.5 线程安全问题 * 第三章 LinkedHashMap:保持插入顺序 * 3.1 数据结构特点 * 3.2 两种排序模式 * 3.

By Ne0inhk