创建具有给定时间复杂度的算法

Create algorithm with given time complexity

如何解决这类问题?我知道基本时间复杂度为 O(n)O(n^2) 等,但是如何创建一个算法 O(m^2*(log(n))^2)O(log(n^2/m))?

是否正确例如: O(m^2*(log(n))^2)

for(i=0; i<m; i++)
  for(j=0; j<m; j++)
     for(k=0; k<n; k*=2)
        for(l=0; l<n; l*=2)
            something()

第二个呢?

已编辑:因为第二个就是这样

O(log(n^2/m))=O(log(n)+log(n/m))

for(i=n;i>0;i/=2);
for(j=n/m;j>0;j/=2);

第四个嵌套循环是O(log n), 第三个嵌套循环是 O(log n), 第二个嵌套循环是 O(m), 第一个循环是 O(m)

因为所有这些循环都是嵌套的,所以很容易理解您必须乘以得到整体复杂度,所以它是: O(mmlog n *log n)=O(m^2 * (log n)^2).

请注意,第三个和第四个循环是 O(log n) 的原因是,例如在第四个循环中,l 在下一个循环中变为 l^2,因此如果 m 是循环重复的总数,则: l^m >=n -> m 是 O(log n) .

出于同样的原因,第三个嵌套循环也是 O(log n)。

也出于同样的原因,如果你有:

for(i=1;i<n*n/m ;i*=2)

上面的循环是 O(log (nn/m)) 因为如果你 m 是循环重复的总数那么: i^m>=nn/m -> O(log(n*n/m)).

更新

O(log(n*n/m)) = O(log n^2/m) = O(2log(n/m)) = O( log(n/m ) ) 而不是 O(log(n)+log(n/m)).

此外,如果您有:

for(i=n;i>0;i/=2)
   for(j=n/m;j>0;j/=2)
      something();

这是外循环的 O(log(n)) 和内循环的 O(log n/m) 所以整体是 O(log(n)*log(n/m )) 而不是 O(log(n)+log(n/m)).