给定代码的渐近分析

时间:2018-05-24 02:50:14

标签: algorithm big-o computer-science asymptotic-complexity

我得到了以下伪代码:

 j = 1
 while j < n:
      k = 2
      while k < n:
           k = k*k
      j++

在我看来,这段伪代码会有以下复杂性:

 O(n*log(n))

由于外循环正在执行n次。虽然内循环基本上每次将增量步长分成两半。我的想法太遥远了吗?

编辑:另外1个(这些不是作业,我保证,只是要理解的例子)

 for i = 1 to n:
    for j = 1 to n:
       k = j*j
       while k < n:
          k++

在这种情况下,最外层循环将执行n次。中间循环也将执行n次,现在我们处于n 2 次。最里面的循环,正如我所说,它将执行log(n)次,将我们放在O(n 2 * log(n))次。我的理解是否正确?

3 个答案:

答案 0 :(得分:6)

这是 <android.support.v7.widget.AppCompatTextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:autoSizeMaxTextSize="31.5px" android:autoSizeMinTextSize="24.674995px"/>

就时间而言,外循环只重复内循环O (n log log n)次,因此它的乘数为n

内循环比较棘手,它会重复平方n。 看看它如何: k 因此,例如,如果2^1 -> 2^2 -> 2^4 -> 2^8 -> 2^16 -> 2^32 -> ...,循环将进行n = 2^32次迭代。 在此,5log_2 (n)32log_2 (32)

通常,如果5,内部循环将在n = 2^(2^r)次迭代后到达n。 通过取对数,我们得到r。 通过再次取对数,我们得到log n = 2^r。 你可能知道,只要它是常数,对数的基数在处理渐近行为时并不重要。

所以,我们有一个循环的log log n = r次迭代,它本身会进行n次迭代,从而使整体复杂度log log n

答案 1 :(得分:0)

是的,你是对的,第一个循环是直接的O(n)。第二部分有点棘手。我将使用原因而不是严谨来显示其O(logn)。

因此我们假设它为k = k * 2一秒钟。这是一个熟悉的序列,我们知道O(logn)但是我们看到k >= 2对于任何给定的循环,所以我们知道序列k = k*k将被O(logn)限制在上面,即它位于大多数 O(logn)。很容易看出它不是O(1)因此我们知道O(1)是下界。一起来获取O(nlogn)

答案 2 :(得分:-1)

O(n log(n))

k ^ log(n)正好是k等于或大于n的值。

  

log(n)= x表示2 ^ x = n

你运行循环n次。

因此复杂度为O(n * log(n))