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

时间:2016-09-10 19:54:22

标签: algorithm time-complexity complexity-theory

如何解决这类问题?我知道基本的时间复杂度为 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()

1 个答案:

答案 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))。