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

时间复杂度和空间复杂度是衡量算法效率的核心指标,均采用大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. 理解复杂度对编写高效代码至关重要。
相关推荐
JieE2121 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack201 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树2 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE2122 天前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2122 天前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术2 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦2 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
用户497863050733 天前
(一)小红的数组操作
算法·编程语言
怕浪猫3 天前
Electron 系列文章封面图
算法·架构·前端框架