zq—算法基础:时空复杂度(1)
算法基础之时空复杂度(1)
算法复杂度的定义
复杂度分析
算法复杂度是衡量算法的重要工具,用于描述算法的资源消耗与输入规模的关系
时间复杂度vs空间复杂度
“时间”vs“存储空间”
预测算法性能,比较不同算法vs评估内存使用,优化存储效率
重要性
复杂度分析帮助我们选择合适的算法,特别是在处理大规模数据时
渐进分析
关注点:
当数据规模n趋于无穷大时的增长趋势
三种情况:
- 最好情况
- 平均情况
- 最坏情况
- 通常分析最坏情况:保证性能下界
数学符号
三种表示法

大 O 的性质
重要性质
- 忽略常数系数:O(3n)=O(n)
- 忽略低阶项:\(O(n^2+n)=O(n^2)\)
- 传递性:如果f(n)=O(g(n))且g(n)=O(h(n)),f(n)=O(h(n))
eg.\(T(n)=5n^2+3n+10\)
\(=O(n^2+n+1)\)
\(=O(n^2)\)
算法复杂度层次图![微信图片_20260317233727_451_800]()
算法竞赛中的复杂度要求
重要原则
- 算法竞赛中,一般每题的复杂度上限为\(2\times10^7\)次操作
- 除特殊情况外,空间复杂度要求一般与时间复杂度要求一致
- 选择算法时,要根据题目给出的数据范围来判断可行的时间复杂度
常数时间复杂度 O(1)
特点:
执行时间与输入规模无关
典型事例
- 变量赋值
- 访问列表、字典某个索引的元素
- 列表尾部的 append、pop 操作
代码示例
点击查看代码
def constant_time(lst);
return lst[0]
典型数据范围
\(n \leq 10^{18} (或10^9)\)
对数时间复杂度 O(log n)
特点:
每次操作将问题规模按比例减小(通常是减半)
典型事例
- 一个循环,其循环变量以乘法或除法方法式逼近边界
代码示例
点击查看代码
def logarithmic_time(n):
i=1
while i<n:
i=i*2
典型数据范围
\(n \leq 10^{18} (或10^9)\)
线性时间复杂度 O(n)
特点:
执行时间与输入规模成正比
典型事例
- 遍历列表
- 列表的pop(O)操作
代码示例
点击查看代码
def linear_time(lst):
for i in lst:
print(i)
典型数据范围
\(n \leq 10^6 (或10^5,2\times10^6)\)
线性对数时间复杂度 O(nlog n)
特点:
通常是将一个 O(log n)的操作重复n次,或一个 O(n)的操作重复log n次
典型事例
- 许多高效算法的标志性复杂度
- 调和级数与线性结合:\(n \times(1+\frac{1}{2}+\frac{1}{3}+...+\frac{1}{n})\)
代码示例
点击查看代码
def harmonic_example(n):
s=0
for i in range(n+1):
for j in range (i,n+1,i):
s+=1
return s
典型数据范围
\(n \leq 2\times10^5 (或10^5)\)
\(n\sqrt{x}\)时间复杂度 \(O(n^{1.5})\)
特点:
复杂度介于线性对数和平方之间,通常出现在较复杂的分块或数学算法中
典型事例
- 分块算法
- 某些数论算法
代码示例
点击查看代码
def n_sqrt_nexample(n):
for i in range(n):
j=0
while j*j<=i:
print(i,j)
j+=1
典型数据范围
\(n \leq 10^4\)
平方时间复杂度 \(O(n^2)\)
特点:
二重嵌套循环的典型复杂度
典型事例
- 二重嵌套循环
代码示例
点击查看代码
def square_time(n):
for i in range(n):
for j in range(n):
print(i,j)
典型数据范围
\(n \leq 5000\)
立方时间复杂度 \(O(n^3)\)
特点:
三重嵌套循环的典型复杂度
典型事例
- 三重嵌套循环
代码示例
点击查看代码
def cubic_time(n):
for i in range(n):
for j in range(n):
for k in range(n):
print(i,j,k)
典型数据范围
\(n \leq 300\)
指数时间复杂度 \(O(2^n)\)
特点:
问题规模每增加1,执行时间翻倍,增长极快。
描述
常出现于解决一个问题的所有可能自己相关的问题中。
典型数据范围
\(n \leq 20\)
阶乘时间复杂度 O(n!)
特点:
极其低效,当n稍大时就无法在合理时间内完成
描述
常出现于需要考虑n个元素所有排列顺序的问题中
典型数据范围
\(n \leq 10\)


浙公网安备 33010602011771号