跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

算法空间复杂度详解:概念与计算实例

算法空间复杂度衡量运行过程中额外临时占用存储空间的大小,采用大 O 渐进表示法。计算规则侧重变量个数,栈空间通常不计入显式申请部分。常见场景包括二维数组开辟 O(n^2),原地排序算法如冒泡排序为 O(1),动态分配数组存储数据为 O(N),递归算法空间复杂度等于单次递归复杂度乘以递归次数。正确分析空间复杂度有助于优化程序内存使用。

并发大师发布于 2026/2/7更新于 2026/10/2294 浏览
算法空间复杂度详解:概念与计算实例

算法的空间复杂度

算法空间复杂度的定义是一个数学表达式,用于度量一个算法在运行过程中额外临时占用存储空间的大小。空间复杂度不是程序占用了多少字节的空间,而是计算变量的个数。其计算规则基本跟时间复杂度类似,也使用大 O 渐进表示法。

注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

常见空间复杂度计算举例

实例一

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)。

实例二

void BubbleSort(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)。

实例三

long long* Fibonacci(size_t n) {
    if (n == 0) return NULL;
    long long* fibArray = (long long*)malloc((n + 1) * sizeof(long long));
    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)。

实例四

long long Fac(size_t N) {
    if (N == 0) return 1;
    return Fac(N - 1) * N;
}

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

递归算法的空间复杂度 = 单次递归的空间复杂度 * 递归次数

全文总结

本文系统性地讲解了算法空间复杂度的核心知识,旨在帮助读者建立一套分析算法效率的完整框架。通过上述实例,可以清晰地理解不同数据结构及算法实现下的空间开销差异。

目录

  1. 算法的空间复杂度
  2. 常见空间复杂度计算举例
  3. 实例一
  4. 实例二
  5. 实例三
  6. 实例四
  7. 全文总结

更多推荐文章

查看全部
  • OKX API 实战指南:基于 python-okx 的量化交易开发
  • Vue 下拉刷新组件开发实战与 Slot 用法详解
  • 基于 Spring Boot 的生鲜农产品智慧物流调度系统设计
  • Flutter 三方库 xpath_selector 在鸿蒙系统的适配与使用指南
  • Llama 开源家族演进:从 Llama-1 到 Llama-3 技术梳理
  • 华为 Eve 多模态模型:弹性视觉专家架构与性能分析
  • Java 开发者利用 Spring AI Alibaba 构建 AI Agent
  • Java 基础(一):发展历程、技术体系与 JDK 环境搭建
  • Minecraft Forge 模组开发框架搭建指南
  • 世界职业院校技能大赛人工智能赛道解析
  • AI 小说生成器本地部署教程
  • C++ 数据结构:单调栈与单调队列总结
  • Triton 编译栈与 RISC-V 生态融合实践
  • React Native HarmonyOS react-native-webview 集成指南
  • 命令行大模型交互工具:MCPHost 实战指南
  • 前端 SSG:静态站点生成实战与架构选择
  • Go、Rust、Kotlin、Python 与 Java 五大主流语言性能与生态对比
  • Windows 安装 Docker 详细教程
  • MySQL ON DUPLICATE KEY UPDATE 实现存在更新不存在插入
  • 算法进阶:前缀和原理与实战应用

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online