如何解决这类问题?我知道基本的时间复杂度为 O(n), O(n ^ 2)等,但是如何创建类似 O(m ^ 2)的算法*(log(n))^ 2)和 O(log(n ^ 2 / m))?
是否正确: 的 O(平方公尺*(的log(n))^ 2)
<?= $form->field($model, 'title')->textInput(['style' => 'width: 150px']) ?>
第二个怎么样?
已编辑:第二个就是那个
O(的log(n ^ 2 /米))= O(的log(n)+日志(N / M))
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()
答案 0 :(得分:1)
第四个嵌套循环是O(log n), 第三个嵌套循环是O(log n), 第二个嵌套循环是O(m), 第一个循环是O(m)
因为所有这些循环都是嵌套的,所以很容易理解你必须乘以得到总体复杂度,因此它是: O(m m log n * log n)= O(m ^ 2 *(log n)^ 2)。
请注意,第三个和第四个循环为O(log n)的原因是例如在第四个循环中l在下一个循环中变为l ^ 2,因此如果m是循环重复的总数,则:l ^ m&gt; = n - &gt; m是O(log n)。
出于同样的原因,第三个嵌套循环也是O(log n)。
同样出于同样的原因,如果你有:
for(i=1;i<n*n/m ;i*=2)
上面的循环是O(log(n n / m)),因为如果你是循环重复的总数,那么: i ^ m&gt; = n n / m - &gt;为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(log) N)+日志(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)+日志(N / M))。