当前位置:   article > 正文

算法的时间复杂度_多个矩阵计算复杂度怎么算

多个矩阵计算复杂度怎么算

1 算法时间复杂度

https://blog.csdn.net/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));
  • 1
  • 2
  • 3
  • 4
  • 5

以上5条语句全是赋值语句,代表所有的加法常数,因此上述这段代码的计算复杂度用O(1)表示即可。

1.1.2 线性阶

线性阶一般涉及非嵌套循环,线性阶就是随着问题规模n的扩大,对应计算次数呈直线增长。

n = 100;
x = zeros(1,n);
for i = 1:n
    x(i) = rand(1);
end
  • 1
  • 2
  • 3
  • 4
  • 5

上述这段代码中,由于循环的次数为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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

外层循环每执行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.csdn.net/qq_23174517/article/details/97243408

https://blog.csdn.net/ztf312/article/details/106692868?utm_medium=distribute.pc_relevant.none-task-blog-title-2&spm=1001.2101.3001.4242

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) XX/(m1),计算复杂度是一样的。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/169369
推荐阅读
相关标签
  

闽ICP备14008679号