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

常见时间复杂度与空间复杂度解析

时间复杂度通过大 O 渐进表示法评估算法效率,重点关注最高阶项。常见复杂度包括常数阶 O(1)、线性阶 O(N)、平方阶 O(N^2) 及对数阶 O(log N)。空间复杂度衡量额外存储空间,冒泡排序等原地算法通常为 O(1)。实际开发中应优先优化时间复杂度,同时根据场景权衡空间开销。

DockerOne发布于 2026/3/25更新于 2026/7/1728 浏览
常见时间复杂度与空间复杂度解析

时间复杂度与空间复杂度

评估一个算法的好坏,核心在于对比其时间和空间两个维度。时间复杂度主要衡量算法运行的快慢,而空间复杂度则关注运行过程中需要的额外存储空间。

大 O 渐进表示法

算法的时间复杂度通常用函数 T(N) 表示,代表基本操作的执行次数。在分析时,我们遵循大 O 渐进表示法的规则:

  1. 只保留最高阶项,忽略低阶项(当 N 趋于无穷大时)。
  2. 如果最高阶项是线性函数,去除常数系数。
  3. 如果没有 N 相关项,仅保留常数 1。

来看一段代码示例:

void Func1(int N) {
    int count = 0;
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            ++count;
        }
    }
    for (int k = 0; k < 2 * N; ++k) {
        ++count;
    }
    int M = 10;
    while (M--) {
        ++count;
    }
}

这里的基本操作次数 T(N) = N² + 2N + 10。随着 N 增大,N² 的影响占主导,因此时间复杂度为 O(N²)。

实际运行时间测试

虽然理论推导很重要,但有时我们也想实测代码耗时。可以使用 clock() 函数记录运算前后的时间点。注意头文件需要包含 <time.h>。

#include <stdio.h>
#include <time.h>

int main() {
    int i = 0;
    clock_t begin = clock();
    int x = 10;
    int n = 100000; // 定义 n 以便循环
    for(i = 0; i < n; i++) {
        x++;
    }
    clock_t end = clock();
    printf("%dms\n", (int)((end - begin) / (double)CLOCKS_PER_SEC * 1000));
    return 0;
}

常见复杂度对比

表达式复杂度说明
5201314O(1)常数阶
3n+4O(n)线性阶
3n^2+4n+5O(n^2)平方阶
log₂nO(log n)对数阶
nlog₂nO(n log n)nlogn 阶
n^3O(n^3)立方阶
2^nO(2^n)指数阶
常数阶 O(1)
int main() {
    int x = 0;
    scanf("%d", &x);
    printf("%d", x);
    return 0;
}

无论输入如何,操作次数固定,复杂度为 O(1)。

线性阶 O(N)

例如 Func2 中,循环次数与 N 成正比,忽略常数项后为 O(N)。如果是两个独立循环分别依赖 M 和 N,且 M 与 N 无关,则复杂度为 O(M+N),通常简化为 O(N)。

平方阶 O(N^2)

嵌套循环是典型的平方阶结构。内层循环每执行一次外层就执行一次,总次数约为 N*N。

对数阶 O(log N)
void func5(int n) {
    int cnt = 1;
    while (cnt < n) {
        cnt *= 2;
    }
}

每次迭代数值翻倍,执行次数 x 满足 2^x = n,即 x = log₂n。

递归函数

递归的时间复杂度是所有递归调用次数的累加。 单递归如阶乘,调用深度为 N,每次操作 O(1),总复杂度 O(N)。 若递归内部包含循环,复杂度会相应增加,例如 O(N^2)。

空间复杂度

空间复杂度衡量的是临时占用存储空间的大小,同样使用大 O 表示法。一般编程中更关注时间复杂度,但在嵌入式开发中空间限制较严。

注意:函数栈帧(参数、局部变量)通常在编译期确定,空间复杂度主要看运行时显式申请的额外空间。

冒泡排序 O(1)
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;
    }
}

除了几个局部变量外没有申请额外数组,空间复杂度为 O(1)。

三个反置 O(N)

如果涉及创建新数组或动态分配内存,空间复杂度通常为 O(N)。例如反转数组的操作,若原地修改则为 O(1),若需辅助数组则为 O(N)。

总的来说,在复杂度分析中,时间复杂度通常是首要考量指标。

目录

  1. 时间复杂度与空间复杂度
  2. 大 O 渐进表示法
  3. 实际运行时间测试
  4. 常见复杂度对比
  5. 常数阶 O(1)
  6. 线性阶 O(N)
  7. 平方阶 O(N^2)
  8. 对数阶 O(log N)
  9. 递归函数
  10. 空间复杂度
  11. 冒泡排序 O(1)
  12. 三个反置 O(N)
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 新版 QQ NT 桌面版内存优化实践
  • 'SVN更新' has encountered a problem :An internal error occurred during: svn错误
  • Flutter 组件 tavily_dart 鸿蒙适配与 AI 搜索集成实战
  • 无需修改 hosts 或镜像源加速 Git Clone 及子模块配置
  • 算法:二分查找(一)朴素二分实现
  • 前缀和算法核心原理与实战应用
  • Diffusion Transformer (DiT):U-Net 换 ViT 架构,应用于视频生成与机器人动作预测
  • Python 3.15 JIT 进展、AI 内核审查与中国大模型现状
  • Neo4j 图数据库从搭建到项目使用深度详解
  • 基于字幕的 AI 电影短视频批量剪辑设计思路
  • Rokid JSAR 基于 Web 技术栈的 AR 开发环境搭建与 3D 时钟实战
  • C++ 继承机制详解:栈实现、名称隐藏与默认成员函数
  • 机器人系统架构详解:2026 年最新技术路线
  • 大模型工具函数调用(Function Calling)技术实践
  • OpenClaw 飞书多 Agent 对接与隔离配置
  • Python FastAPI 入门实战:从环境搭建到接口开发
  • Spring Boot 集成本地 OCR 服务模块实战
  • C++ 类型转换详解:显式运算符与底层机制
  • Java 大数据在智能家居环境监测与智能调节中的应用
  • 鸿蒙电商购物车项目:用户管理、商品列表与购物车实现

相关免费在线工具

  • 加密/解密文本

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