如何解决这种问题?我知道基本时间复杂度为O(n),O(n ^ 2)等,但是如何创建一个具有O(m^ 2×(log(n))^ 2)和O(log(n ^ 2/m))的算法?
它是对的吗例如:
o(m^2*(对数(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(对数(n^2/m))=o(对数(n)+对数(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(m m log n*logn)=o(m^2*(logn)^2)。
注意,第三个和第四个循环是O(log n)的原因是,例如在第四个循环中,l is在下一个循环中变为l^2,所以如果m是循环重复的总数,那么:l^m>=n->m是O(logn)。
出于同样的原因,第三个嵌套循环也是O(log n)。
同样的原因,如果你有:
for(i=1;i<n*n/m ;i*=2)
上面的循环是o(log(nn/m)),因为如果m是循环重复的总数,那么:
i^m>=n n/m->o(对数(n*n/m))。
更新
O(对数(n*n/m))=O(对数n^2/m)=O(2log(n/m))=O(对数(n/m))而不是O(对数(n)+log(n/m))。
如果你有:
for(i=n;i>0;i/=2)
for(j=n/m;j>0;j/=2)
something();
这是O(log(n))表示外环,O(logn/m)表示内环,所以总的来说是O(logn)*logn/m),而不是O(logn)+logn/m)。
关于algorithm - 创建具有给定时间复杂度的算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39430041/