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

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

算法空间复杂度衡量运行过程中额外临时占用的存储空间大小,通常使用大 O 渐进表示法。它关注变量个数而非具体字节数,重点在于显式申请的额外空间及递归栈帧。常见场景包括动态二维数组的 O(n^2)、原地排序的 O(1)、动态数组的 O(n) 以及递归调用的 O(n)。分析时需注意区分输入数据本身占用的空间与算法运行产生的额外开销,从而准确评估算法效率。

云朵棉花糖发布于 2026/3/24更新于 2026/6/315 浏览
算法空间复杂度详解:概念与常见计算实例

在这里插入图片描述

算法在运行过程中不仅消耗时间,也占用内存。衡量算法好坏,除了时间复杂度,空间复杂度同样关键。它主要衡量算法运行所需的额外临时存储空间大小,通常用大 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;
}

这段代码开辟了一个二维数组,共有 n 行,每行分别有 1 到 n 列。总元素个数为 n(n+1)/2,根据大 O 推导规则,忽略低阶项和系数,空间复杂度为 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;
    }
}

原地排序算法通常不需要额外开辟大量空间。这里只使用了 end、exchange、i 等常数个辅助变量,所以空间复杂度是 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;
}

这里动态开辟了 n+1 个 long long 类型的空间,随着 n 线性增长,空间复杂度为 O(n)。

递归调用

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

递归的深度决定了栈帧的数量。这里调用了 N 次,每个栈帧占用常数空间,因此空间复杂度为 O(N)。一般规律是:递归算法的空间复杂度 = 单次递归的空间复杂度 × 递归次数。

在这里插入图片描述

掌握空间复杂度的核心在于识别额外申请的空间来源,无论是动态内存还是递归栈帧。理解这些有助于编写更高效的程序。

  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Stable Diffusion v1.5 电商视觉实战:主图/Banner/邮件头图生成方案
  • 手写 C++ TCP 服务器:自定义协议与粘包处理实战
  • Flutter 应用架构演进:从 v1.0 基础骨架到 v2.0 Riverpod 实战
  • Git 入门指南:从零理解版本控制与团队协作
  • 鸿蒙 WebView 混合开发中 Web 组件跨域问题的客户端解决方案
  • 千笔 AI 辅助论文写作工具核心功能介绍
  • 基于博弈论自适应策略和 CVACA 固定路径策略的多无人机部署与运动仿真
  • AbortController 入门:前端请求取消的最佳实践
  • 双目相机视差算法原理及深度计算详解
  • Nunchaku FLUX.1 CustomV3:AI 绘画快速上手指南
  • C++ 运算符重载入门:分数类实现示例
  • 从零构建高可用系统:端到端架构实战解析与避坑指南
  • Java 时间类(上):JDK7 及以前 Date、SimpleDateFormat、Calendar 详解
  • Python 自动化:wxauto 安装失败解决方案与实战
  • Python 商业爬虫三大核心项目全流程落地指南
  • Spring AI ImageModel 集成 OpenAI DALL-E 图像生成指南
  • 自进化医疗智能体:动态记忆与持续运行的 Python 架构设计
  • 基于 Trae Agent 与 MCP Tools 实现 Gitee 自动化辅助
  • YOLOv8 逐位数字框检测模型训练实战
  • 从多库并存到一库多能:金仓 KingbaseES 融合架构实践

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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