算法复杂度,简单来说,是评估一个算法在运行过程中所需计算资源(包括时间和空间)的度量标准。它通常分为两大类:一类关注时间开销,一类关注空间占用。
一、时间复杂度
首先,我们来了解时间复杂度。很多人误以为时间复杂度是指代码执行的具体耗时秒数——实际上并非如此。时间复杂度本质上是一个函数,用于定性描述算法运行时间随输入数据规模增长的演化趋势。借助时间复杂度,我们无需实际运行代码,即可比较不同算法的性能优劣。例如,一个时间复杂度为O(n)的算法,在数据量增大时,其性能表现始终优于O(n²)的算法,因为前者的增长曲线更为平缓。

二、空间复杂度
空间复杂度的概念与时间复杂度类似,只是将衡量的资源从“时间”替换为“空间”。根据维基百科的定义,算法或计算机程序的空间复杂度,是指解决某个计算问题实例所需的存储空间量,该量是输入特征数量的函数。
以下,我们整理了多种常见机器学习算法的计算复杂度,供您参考。
1. 线性回归
n = 训练样本数量,f = 特征维度
训练时间复杂度:O(f²n + f³)
预测时间复杂度:O(f)
运行时空间复杂度:O(f)
2. 逻辑回归
n = 训练样本数量,f = 特征维度
训练时间复杂度:O(f * n)
预测时间复杂度:O(f)
运行时空间复杂度:O(f)
3. 支持向量机
n = 训练样本数量,f = 特征维度,s = 支持向量数量
训练时间复杂度:O(n²) 到 O(n³),具体因核函数而异。
预测时间复杂度:O(f) 到 O(s * f)——线性核为 O(f),RBF 和多项式核则为 O(s * f)
运行时空间复杂度:O(s)
4. 朴素贝叶斯
n = 训练样本数量,f = 特征维度,c = 类别数
训练时间复杂度:O(n * f * c)
预测时间复杂度:O(c * f)
运行时空间复杂度:O(c * f)
5. 决策树
n = 训练样本数量,f = 特征维度,d = 树的深度,p = 节点数
训练时间复杂度:O(n * log(n) * f)
预测时间复杂度:O(d)
运行时空间复杂度:O(p)
6. 随机森林
n = 训练样本数量,f = 特征维度,k = 树的数量,p = 树中的节点数,d = 树的深度
训练时间复杂度:O(n * log(n) * f * k)
预测时间复杂度:O(d * k)
运行时空间复杂度:O(p * k)
7. K近邻
n = 训练样本数量,f = 特征维度,k = 近邻数
Brute(暴力法):
训练时间复杂度:O(1)
预测时间复杂度:O(n * f + k * f)
运行时空间复杂度:O(n * f)
kd-tree:
训练时间复杂度:O(f * n * log(n))
预测时间复杂度:O(k * log(n))
运行时空间复杂度:O(n * f)
8. K-means 聚类
n = 训练样本数量,f = 特征维度,k = 簇数,i = 迭代次数
训练时间复杂度:O(n * f * k * i)
运行时空间复杂度:O(n * f + k * f)
