时间复杂度(Time Complexity)
定义:
时间复杂度描述算法执行时间随输入规模(通常用 n 表示)增长的渐进趋势,通常用大 O 符号(Big O Notation)表示。它关注的是操作次数的增长级别,而非实际时间。
关键点:
-
大 O 表示法:表示算法的最坏情况时间复杂度,忽略常数项和低阶项。例如:
- O(3n2+2n+1) 简化为 O(n2)。
- 单层循环(执行 n 次)的时间复杂度为 O(n)。
- 嵌套两层循环(每层 n 次)的时间复杂度为 O(n2)。
-
常见复杂度级别(按效率从高到低排序):
- O(1):常数时间(如数组随机访问)。
- O(logn):对数时间(如二分查找)。
- O(n):线性时间(如遍历数组)。
- O(nlogn):线性对数时间(如归并排序)。
- O(n2):平方时间(如冒泡排序)。
- O(2n):指数时间(如暴力穷举)。
-
最好、最坏与平均情况:
- 最坏情况:算法的最差表现(如快速排序在输入已排序时为 O(n2))。
- 平均情况:统计意义上的期望值(如快速排序平均为 O(nlogn))。
- 最好情况:算法的最优表现(如插入排序在输入已排序时为 O(n))。
空间复杂度(Space Complexity)
定义:
空间复杂度描述算法运行过程中占用的额外内存空间随输入规模增长的渐进趋势,同样用大 O 表示法。它关注的是除输入数据本身外所需的额外空间。
关键点:
-
常见复杂度级别:
- O(1):原地算法(如冒泡排序,仅用常数个变量)。
- O(n):需额外线性空间(如归并排序需临时数组)。
- O(logn):递归调用栈的深度(如快速排序的递归实现)。
-
递归算法的空间复杂度:
- 递归调用栈的深度直接影响空间复杂度。例如:
- 斐波那契数列的递归实现空间复杂度为 O(n)(递归深度为 n)。
- 尾递归优化可将空间复杂度降至 O(1)(如某些语言的优化)。
- 递归调用栈的深度直接影响空间复杂度。例如:
-
原地操作(In-place):
若算法不需要额外空间(或仅用常数空间),则称其为原地算法,如交换两个变量。
示例分析
-
冒泡排序:
- 时间复杂度:O(n2)(嵌套循环)。
- 空间复杂度:O(1)(原地交换)。
-
归并排序:
- 时间复杂度:O(nlogn)(分治策略)。
- 空间复杂度:O(n)(需临时数组合并子序列)。
-
二分查找:
- 时间复杂度:O(logn)(每次缩小一半搜索范围)。
- 空间复杂度:O(1)(迭代实现)或 O(logn)(递归实现)。
总结
- 时间复杂度关注操作次数的增长趋势,用于衡量算法速度。
- 空间复杂度关注额外内存的使用,用于衡量内存效率。
- 两者均用大 O 表示法,忽略常数和低阶项,聚焦增长级别。
- 实际应用中需结合数据规模和常数因子,但大规模数据下复杂度分析更为关键。
通过掌握时间复杂度和空间复杂度,可以更科学地选择和优化算法,尤其是在处理大规模数据时,高效的算法设计至关重要。