一. 什么是时间复杂度
时间复杂度,粗暴理解即算法的速度。算法中的基本操作重复执行的次数是问题规模n的某个函数,其时间度量记做T(n)=O(f(n))(其中“O”是指T(n)的数量级),称作算法的渐进时间复杂度,简称时间复杂度。时间复杂度一般用最深层循环内的语句中的原操作的执行频度(重复执行的次数)来表示。
二. 常见的时间复杂度
- O(1):常数级别,表示算法的执行时间与输入数据的规模无关,总是保持恒定。
- O(log2n):对数级别,表示算法的执行时间随着输入数据规模的增加而以对数速度增加。
- O(n):线性级别,表示算法的执行时间随着输入数据规模的增加而线性增加。
- O(n log2n):线性对数级别,表示算法的执行时间随着输入数据规模的增加而以线性对数速度增加。
- O(n2):平方级别,表示算法的执行时间随着输入数据规模的增加而以平方速度增加。
- O(n3):立方级别,表示算法的执行时间随着输入数据规模的增加而以立方速度增加。
常用的时间复杂度的关系:O(1)<O(log2n)<O(n)<O(n log2n)<O(n2)<O(n3)
指数时间复杂度关系为:O(2n)<O(n!)<O(nn)
有的情况下,算法中基本操作重复执行的次数会随问题的输入数据集的不同而不同。
三. 算法案例
- O(1) 时间复杂度:常数时间复杂度的算法,无论输入数据规模如何,执行时间都保持不变。
def constant_time_example():
# 执行时间与输入数据规模无关
result = 5 + 3
return result
- O(log2n) 时间复杂度:对数时间复杂度的算法,执行时间随着输入数据规模的对数增长。
def logarithmic_time_example(n):
# 执行时间与输入数据规模的对数成正比
result = 0
for i in range(n):
result += i
return result
- O(n) 时间复杂度:线性时间复杂度的算法,执行时间随着输入数据规模的线性增长。
def linear_time_example(n):
# 执行时间与输入数据规模的线性成正比
result = 0
for i in range(n):
result += i
return result
- O(n log2n) 时间复杂度:对数线性时间复杂度的算法,执行时间随着输入数据规模的对数线性增长。
def logarithmic_linear_time_example(n):
# 执行时间与输入数据规模的对数线性成正比
result = 0
for i in range(n):
for j in range(i):
result += j
return result
- O(n2) 时间复杂度:平方时间复杂度的算法,执行时间随着输入数据规模的平方增长。
def quadratic_time_example(n):
# 执行时间与输入数据规模的平方成正比
result = 0
for i in range(n):
for j in range(n):
result += i * j
return result
- O(n3) 时间复杂度:立方时间复杂度的算法,执行时间随着输入数据规模的立方增长。
def cubic_time_example(n):
# 执行时间与输入数据规模的立方成正比
result = 0
for i in range(n):
for j in range(n):
for k in range(n):
result += i * j * k
return result