时间复杂度与空间复杂度备忘录

时间复杂度和空间复杂度是衡量算法效率的核心指标,均采用大O符号(Big O)**表示,描述算法性能随输入规模(n)增长的变化趋势。


目录

时间复杂度

[O(1) 常数阶](#O(1) 常数阶)

[O(n) 线性阶](#O(n) 线性阶)

[O(n²) 平方阶](#O(n²) 平方阶)

[O(log n) 对数阶](#O(log n) 对数阶)

[O(n log n) 线性对数阶](#O(n log n) 线性对数阶)

空间复杂度

[O(1) 常数阶](#O(1) 常数阶)

[O(n) 线性阶](#O(n) 线性阶)

[O(n²) 平方阶](#O(n²) 平方阶)

[O(n) 递归栈空间](#O(n) 递归栈空间)

复杂度对比

实际应用权衡

总结

时间复杂度

衡量代码执行时间随数据规模增长的变化趋势。

O(1) 常数阶

执行次数固定,与输入规模无关。

c 复制代码
int constantTime(int n) {
    int a = 10;
    int b = 20;
    return a + b;
}
  • 特点:执行时间恒定,不受输入规模影响,效率最优。
O(n) 线性阶

执行次数与输入规模成正比。

c 复制代码
void linearTime(int n) {
    for (int i = 0; i < n; i++) {
        printf("当前数字: %d\n", i);
    }
}
  • 特点:常见于单层循环或数组遍历。
O(n²) 平方阶

执行次数与n的平方成正比。

c 复制代码
void quadraticTime(int n) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("坐标: (%d, %d)\n", i, j);
        }
    }
}
  • 特点:常见于双重嵌套循环(如冒泡排序),n较大时性能急剧下降。
O(log n) 对数阶

每次执行缩减问题规模(如减半)。

c 复制代码
void logarithmicTime(int n) {
    for (int i = 1; i < n; i *= 2) {
        printf("当前数字: %d\n", i);
    }
}
  • 特点:效率极高,常见于二分查找或分治算法。
O(n log n) 线性对数阶

结合线性与对数增长。

c 复制代码
void nLogNExample(int n) {
    for (int i = 0; i < n; i++) {
        for (int j = 1; j < n; j *= 2) {
            // 执行操作
        }
    }
}
  • 特点:常见于高效排序算法(如归并排序)。

空间复杂度

衡量算法运行中额外申请的内存空间(不含输入数据本身)。

O(1) 常数阶

仅使用固定数量的变量。

c 复制代码
void constantSpace(int n) {
    int sum = 0;
    for (int i = 0; i < n; i++) {
        sum += i;
    }
}
O(n) 线性阶

额外空间与输入规模成正比。

c 复制代码
void linearSpace(int n) {
    int* arr = (int*)malloc(n * sizeof(int));
    free(arr);
}
O(n²) 平方阶

额外空间随n呈平方增长(如二维数组)。

c 复制代码
void quadraticSpace(int n) {
    int** matrix = (int**)malloc(n * sizeof(int*));
    for (int i = 0; i < n; i++) {
        matrix[i] = (int*)malloc(n * sizeof(int));
    }
}
O(n) 递归栈空间

递归深度决定空间复杂度。

c 复制代码
void recursiveSpace(int n) {
    if (n <= 0) return;
    recursiveSpace(n - 1);
}

复杂度对比

复杂度 名称 增长趋势 典型场景 性能评价
O(1) 常数阶 恒定 数组访问 最优
O(log n) 对数阶 极缓慢 二分查找 优秀
O(n) 线性阶 线性增长 单层循环 良好
O(n log n) 线性对数阶 较缓慢 归并排序 较好
O(n²) 平方阶 快速增长 冒泡排序 一般
O(2ⁿ) 指数阶 指数爆炸 暴力穷举 较差

实际应用权衡

  • 时间换空间:优化内存使用,但增加计算时间。
  • 空间换时间:通过缓存或预计算提升速度,但占用更多内存。

总结

  1. 时间复杂度反映执行时间的增长趋势。
  2. 空间复杂度反映内存使用的增长趋势。
  3. 选择算法需综合两者,通常需权衡时间与空间效率。
  4. 理解复杂度对编写高效代码至关重要。
相关推荐
和裕19 分钟前
全纸结构重型纸箱能否满足 1 吨以上设备出口熏蒸豁免要求?通关合规性全解析
大数据·运维·网络·人工智能·算法
tangguofeng1 小时前
不带头结点的链队操作集(不含InitFlag)(C语言版)
算法
苏打豆2 小时前
CRISP源码阅读——基于ROS2力矩反馈控制器与速度加速度零空间
c++·线性代数·算法·矩阵·机器人
蛋蛋的就会顺顺的3 小时前
hot100——矩阵
java·数据结构·算法·leetcode·力扣
老歌老听老掉牙3 小时前
麻花钻切屑形态演变的力学机制与临界条件分析
python·算法·钻头
zhangfeng11333 小时前
国产GPU/AI算力芯片现状(修订完整版 · 截至2026年9月
人工智能·算法·ai编程·npu
学代码的CJY4 小时前
从代码出发理解时间复杂度与空间复杂度
数据结构·算法
白帽攻防录4 小时前
SRC 挖洞:WSO2 JWT 算法混淆绕过深度复盘,CVE-2026-5430 不支持的算法怎么变成管理员
网络·算法·安全·网络安全·jwt
小O的算法实验室5 小时前
IEEE TEVC,基于精确与DQN群智能调度方法用于多目标异构USV
算法
字节跳动的猫5 小时前
LikeShop 积分体系全链路改造:获取规则、订单抵扣与积分商品兑换二开
运维·数据结构