【问题标题】:Time complexity in terms of Big O大 O 的时间复杂度
【发布时间】:2020-01-30 08:07:50
【问题描述】:

我有一个对图像进行 4 级分解的代码。这些级别类似于图像的小波变换,将图像分解为 4 个级别:近似部分和三个详细部分。我实现的代码使用广义 SVD 来进行这种分解。这是代码

      function[Y,U] = MSVD1(X)
       %multiresolution SVD (MSVD)
        %input-> x: image (spatial domain)
        %outputs-> Y: one level MSVD decomposition of x
        %          U: the unitary matrix (U in SVD)
         [m,n] = size(X);
        m = m/2; n = n/2;
        A = zeros(4,m*n); 
        for j = 1:n
         for i = 1:m
           A(:,i + (j-1)*m) = reshape(X((i-1)*2+(1:2),(j-1)*2+(1:2)),4,1);
         end
        end
      [U,S] = svd(A);
       T = U'*A;
      Y.LL = reshape(T(1,:),m,n);
      Y.LH = reshape(T(2,:),m,n);
      Y.HL = reshape(T(3,:),m,n);
      Y.HH = reshape(T(4,:),m,n);
      end

现在涉及到的基本操作是使用 SVD。所以我的问题是大 O 表示法的时间复杂度是否应该与矩阵的普通 SVD 相同?如果不是,我们需要考虑哪些条款才能找到图像输入大小的复杂性?重塑元素是否也增加了时间复杂度,还是只是 O(1)? 有人可以帮忙吗?

【问题讨论】:

标签: matlab time time-complexity


【解决方案1】:

首先,常量大小reshape(循环内)的复杂度是O(1)。因此,for 循环的复杂度为\Theta(m*n)。其次,svd 的复杂度是O(max(m, n) * min(m, n)),根据函数返回的数据,它可以是O(max(m, n)^2)(根据this reference)。此外,根据@Daniel 注释,在代码末尾进行重塑的最坏情况可能是O(m*n)(通常小于此值)。

因此,代码的复杂度为O(max(m, n)^2)。另外,由于循环,它是Omega(m*n)

【讨论】:

  • 不是O(max(m, n) * min(m, n))===O(m*n)?
  • @AnderBiguri 是的,确实:)
猜你喜欢
  • 1970-01-01
  • 2018-07-08
  • 2014-05-29
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多