计算复杂度
1 算法时间复杂度
https://blog.youkuaiyun.com/qq_17534301/article/details/82872357
算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)= O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度,是一种“渐进表示法”。其中f(n)是问题规模n的某个函数。
算法时间复杂度一般用大O记法。
1.1 推导大O阶的方法
- 用常数1取代运行时间中的所有加法常数;
- 在修改后的运行次数函数中,只保留最高阶项;
- 如果最高阶项存在且不是1,则去除与这个项相乘的常数;
- 得到的最后结果就是大O阶。
1.1.1 常数阶
一般是指所有的加法常数,没有循环项等,如下面这段代码:
d = [5000 50];
q = [3 3];
sigmar = 0.01;sigmac = 0.01;
C = randn(d(1),q(1));
R = randn(d(2),q(2));
以上5条语句全是赋值语句,代表所有的加法常数,因此上述这段代码的计算复杂度用O(1)表示即可。
1.1.2 线性阶
线性阶一般涉及非嵌套循环,线性阶就是随着问题规模n的扩大,对应计算次数呈直线增长。
n = 100;
x = zeros(1,n);
for i = 1:n
x(i) = rand(1);
end
上述这段代码中,由于循环的次数为n,故此段代码的时间复杂度为O(n)。
1.1.3 平方阶
n = 100;
y = zeros(n,n);
for i = 1:n % 该循环的时间频度为n
for j = 1:n % 该循环的时间频度为n^2
y(i,j) = rand(1); %时间频度为n^2
end
end
外层循环每执行1次,内层循环就需要执行n次,因此总体需要执行 n 2 n^2 n2次,故这段代码的时间复杂度为 O ( n 2 ) O(n^2) O(n2)。
1.1.4 函数调用的时间复杂度分析
首先要计算调用的该函数的时间复杂度是多少,计算总体的时间复杂度。
1.1.5 时间复杂度耗费时间的大小排序
常用的时间复杂度所耗费的时间从小到大依次是:
O(1) < O(logn) < (n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)
2 矩阵计算的时间复杂度
下面两个链接是转载的关于矩阵计算复杂度的例子:
https://blog.youkuaiyun.com/qq_23174517/article/details/97243408
2.1 普通矩阵乘法的计算复杂度
两个普通矩阵相乘,如:
A
n
×
m
B
m
×
p
=
C
n
×
p
A_{n\times m}B_{m\times p} =C_{n\times p}
An×mBm×p=Cn×p
(1)用遍历算法则有两层循环,需要遍历n行和p列,而两层循环体的内部则是m个元素的乘积之和,因此时间频度为
T
(
n
)
=
n
+
n
p
+
n
p
m
T(n) = n+np+npm
T(n)=n+np+npm,因此时间复杂度为
O
(
n
p
m
)
O(npm)
O(npm);
(2)或者根据矩阵C来理解也可。矩阵C共有
n
×
p
n\times p
n×p个元素,每个元素是由A的一行和B的一列来计算的,每个元素的计算复杂度为
n
n
n,故矩阵C的计算复杂度为
O
(
n
p
m
)
O(npm)
O(npm)
A
n
×
m
B
m
×
n
=
C
n
×
n
A_{n\times m}B_{m\times n} =C_{n\times n}
An×mBm×n=Cn×n
当
p
=
n
p=n
p=n时,矩阵C的计算复杂度为
O
(
n
2
m
)
O(n^2m)
O(n2m)。
三个普通矩阵相乘,如:
A
n
×
m
B
m
×
n
C
n
×
p
=
D
n
×
p
A_{n\times m}B_{m\times n} C_{n\times p} =D_{n\times p}
An×mBm×nCn×p=Dn×p
根据两个矩阵相乘的计算复杂度算法,矩阵AB =E的计算复杂度为
O
(
n
2
m
)
O(n^2m)
O(n2m),矩阵EC=D的计算复杂度为
O
(
n
2
p
)
O(n^2p)
O(n2p),故三个矩阵相乘的总体时间复杂度应该为两者之和,但根据推导大O阶原则要只保留最高阶项,所以,总体时间复杂度为
O
(
n
2
max
(
m
,
p
)
)
O(n^2\max(m,p))
O(n2max(m,p))。
2.2 协方差矩阵的时间复杂度
向量的协方差公式如下:
矩阵的协方差与向量的协方差定义相似:
计算协方差矩阵的时间复杂度如下:
- 将矩阵X看做是n个c向量的组合,每个c向量具有m个元素;
- 矩阵的列协方差矩阵就是按照向量的协方差来计算的;矩阵的列协方差矩阵的每一个元素是由两个列向量的协方差,由于每个列向量有m个元素,故计算量为m;
- 列协方差矩阵中共有n行n列,所以需要做 n 2 n^2 n2次协方差计算。
综上所述,上述矩阵X由列组成的协方差矩阵的时间复杂度为 O ( n 2 m ) O(n^2m) O(n2m),和矩阵运算的复杂度是一样的,其实也可以通过矩阵来求解协方差矩阵 X ′ X / ( m − 1 ) X'X/(m-1) X′X/(m−1),计算复杂度是一样的。