在数据结构的绪论中,时间复杂度空间复杂度是两个非常重要的概念,它们是衡量算法性能的关键指标。下面是详细讲解:


一、时间复杂度(Time Complexity)

1. 定义

时间复杂度是指算法执行所需要的基本操作次数(如比较、赋值等),通常用大O符号表示,如 O(1)O(n)O(n²) 等。

2. 常见时间复杂度(按效率从高到低)

时间复杂度描述举例
O(1)常数时间访问数组元素
O(log n)对数时间二分查找
O(n)线性时间遍历数组
O(n log n)线性对数时间归并排序、快速排序
O(n²)二次时间冒泡排序、选择排序
O(2ⁿ)指数时间斐波那契递归
O(n!)阶乘时间全排列问题

3. 计算方法

  • 只关注最高阶项(忽略常数、低阶项)
    例:T(n) = 3n² + 5n + 2 → 时间复杂度为 O(n²)
  • 循环嵌套法则:嵌套循环时间复杂度相乘
    例:两层嵌套循环 → O(n²)

二、空间复杂度(Space Complexity)

1. 定义

空间复杂度是指算法在运行过程中临时占用的存储空间大小,也使用大O表示。

2. 举例说明

  • 使用一个固定大小的变量:O(1)
  • 使用一个长度为n的数组:O(n)
  • 递归调用栈深度为n:O(n)

3. 空间与时间的权衡

有时为了提高运行速度,可以增加空间(如用哈希表代替遍历),这就是时间换空间,反之亦然。


三、常见例子分析

例1:数组求和

int sum = 0;
for(int i = 0; i < n; i++) {
    sum += a[i];
}
  • 时间复杂度:O(n)(遍历n次)
  • 空间复杂度:O(1)(只用一个sum变量)

例2:递归求斐波那契数列

int fib(int n) {
    if(n <= 1) return n;
    return fib(n-1) + fib(n-2);
}
  • 时间复杂度:O(2ⁿ)(树形递归)
  • 空间复杂度:O(n)(递归深度)

四、总结口诀

  • 看循环数,判时间复杂度
  • 有递归,拆树看规模
  • 记住常用复杂度排序:O(1) < O(log n) < O(n) < O(n log n) < O(n²) < O(2ⁿ) < O(n!)