时间复杂度与空间复杂度
一、数据结构与算法基础
数据结构:是计算机科学中用于组织、存储和管理数据的一种方式。
- 用于实现高效的数据访问、修改和操作
- 它定义了数据元素之间的逻辑关系、存储方式以及相关的操作(如:增删查改),是算法设计和程序优化的基础
算法:是解决特定问题的一系列明确、有限的步骤。
- 用于对数据进行计算、处理或自动化决策
- 它是计算机程序的逻辑核心,决定了程序的效率和正确性
小知识:记住以下数学表达式可以方便地估算时间复杂度
- $2^{10} = 1024$
- $2^{20} = 1024 \times 1024 \approx 100\text{万}$
- $2^{30} = 1024 \times 1024 \times 1024 \approx 10\text{亿}$
二、算法的时间复杂度
1. 时间复杂度定义
时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。
一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。
即:找到某条基本语句与问题规模 N 之间的数学表达式,就是算出了该算法的时间复杂度
2. 大 O 的渐进表示法
大 O 符号(Big O notation):是用于描述函数渐进行为的数学符号。
推导大 O 阶方法:
- 用常数 1 取代运行时间中的所有加法常数。
- 在修改后的运行次数函数中,只保留最高阶项。
- 如果最高阶项存在且不是 1,则去除与这个项目相乘的常数。得到的结果就是大 O 阶。
例如:若一个算法的执行次数函数为:$T = 3N^2 + 2N + 100$,那么该算法的大 O 的渐进表示法的时间复杂度为 $O(N^2)$
另外有些算法的时间复杂度存在最好、平均和最坏情况:
- 最坏情况:任意输入规模的最大运行次数 (上界)
- 平均情况:任意输入规模的期望运行次数
- 最好情况:任意输入规模的最小运行次数 (下界)
例如:在一个长度为 N 数组中搜索一个数据 x
- 最好情况:1 次找到
- 最坏情况:N 次找到
- 平均情况:N/2 次找到
在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为 $O(N)$
3. 常见时间复杂度计算举例
常数阶 O(1)
// Func2 的时间复杂度
void Func2(int N) {
int count = 0;
for (int k = ; k < ; ++k)
count++;
(, count);
}


