web-dev-qa-db-ja.com

これらのさまざまなループのbig-Oランタイムを決定しますか?

フィードバックと回答が必要な一連の質問があります。これは宿題ではなく、試験の準備準備です。

私の主な問題は、さまざまな場合のループの反復を決定することです。それを理解しようとするとどうなりますか?

実行時間を評価します。

Q2。

 for(int i =0 ; i < =n ; i++) // runs n times
   for(int j =1; j<= i * i; j++) // same reasoning as 1. n^2
      if (j % i == 0)
         for(int k = 0; k<j; k++) // runs n^2 times? <- same reasoning as above.
            sum++;

正解:N×N2×N = O(N ^ 4)

以下の質問については、正しい答えがありません。

Q3。 a)

     int x=0; //constant
     for(int i=4*n; i>=1; i--) //runs n times, disregard the constant
         x=x+2*i;

私の答え:O(n)

b)簡単にするために、n = 3 ^ kと仮定する

    int z=0;
    int x=0;
    for (int i=1; i<=n; i=i*3){ // runs n/3 times? how does it effect final answer?
       z = z+5;
       z++;
       x = 2*x;
    }

私の答え:O(n)

c)簡単にするために、n = k ^ 2と仮定します。

   int y=0; 
   for(int j=1; j*j<=n; j++) //runs O(logn)?  j <= (n)^1/2
   y++; //constant

私の答え:O(logn)

d)

  int b=0; //constant
  for(int i=n; i>0; i--) //n times
    for(int j=0; j<i; j++) // runs n+ n-1 +...+ 1. O(n^2) 
      b=b+5;

私の答え:O(n ^ 3)

(e)

 int y=1;
 int j=0;
 for(j=1; j<=2n; j=j+2) //runs n times
    y=y+i;
 int s=0;
 for(i=1; i<=j; i++) // runs n times
 s++;

私の答え:O(n)

(f)

 int b=0;
 for(int i=0; i<n; i++) //runs n times
   for(int j=0; j<i*n; j++) //runs n^2 x n times? 
      b=b+5;

私の答え:O(n ^ 4)

(g)簡単にするために、正の整数kに対してn = 3kと仮定します。

   int x=0;
   for(int i=1; i<=n; i=i*3){  //runs 1, 3, 9, 27...for values of i. 
     if(i%2 != 0) //will always be true for values above
      for(int j=0; j<i; j++) // runs n times
        x++;
    }

私の答え:O(n x log base 3 n?)

(h)簡単にするために、正の整数kに対してn = k2と仮定します。

   int t=0;
   for(int i=1; i<=n; i++) //runs n times
      for(int j=0; j*j<4*n; j++) //runs O(logn)
         for(int k=1; k*k<=9*n; k++) //runs O(logn)
            t++;

私の答え:n x logn x log n = O(n log n ^ 2)

(i)単純化のため、いくつかの正の整数sに対してn = 2sと仮定します。

   int a = 0;
   int k = n*n;
     while(k > 1) //runs n^2
     {
       for (int j=0; j<n*n; j++) //runs n^2
          { a++; }
        k = k/2;
    }

私の答え:O(n ^ 4)

(j)

  int i=0, j=0, y=0, s=0;
  for(j=0; j<n+1; j++) //runs n times
     y=y+j; //y equals n(n+1)/2 ~ O(n^2)
  for(i=1; i<=y; i++) // runs n^2 times
     s++;

私の答え:O(n ^ 3)

(k)int i = 1、z = 0; while(z <n *(n + 1)/ 2){//算術級数、z + = iをn回実行i ++; }

私の答え:O(n)

(m)簡単にするために、正の整数sに対してn = 2sと仮定します。

  int a = 0;
  int k = n*n*n;
  while(k > 1) //runs O(logn) complexity
   {
     for (int j=0; j<k; j++) //runs n^3 times
      { a--; }
     k = k/2; 
    }

私の答え:O(n ^ 3 log n)

質問4

http://i.stack.imgur.com/zMkt7.jpg

  • a)True-n ^ 2で境界が定められているため
  • b)False-f(n) g(n)より厳密には小さくない
  • c)真
  • d)真-n ^ 10で区切られる
  • e)False-f(n) g(n)より厳密には小さくない
  • f)真
  • g)真
  • h)false-O(nlogn)と等しくないため
  • i)本当
  • j)わからない
  • k)わからない
  • l)わからない-どのようにこれらを試してみるべきですか?*

前もって感謝します。

19
warpstar

これらを1つずつ見ていきましょう。

パート(a)

 int x=0; //constant
 for(int i=4*n; i>=1; i--) //runs n times, disregard the constant
     x=x+2*i;

私の答え:O(n)

うん!そのとおりです。ループはO(n)回実行され、O(1)反復ごとに作業します。

パート(b)

int z=0;
int x=0;
for (int i=1; i<=n; i=i*3){ // runs n/3 times? how does it effect final answer?
   z = z+5;
   z++;
   x = 2*x;
}

私の答え:O(n)

そうでもない。ループが進行するにつれて、iの値について考えてください。一連の値1、3、9、27、81、243、...、3を取りますkiは各反復で3倍になるため、3の累乗を引き継ぎます。

ループは明らかにO(1)反復あたりの作業のみを行うので、ここでの主な問題は、合計反復回数がいくつになるかということです。i> nkをループの任意の反復とすると、反復ikの値は3になります。k。ループは3のときに停止しますk > n、k> logのときに発生3 n。したがって、反復回数はO(log n)のみであるため、総複雑度はO(log n)です。

パート(c)

int y=0; 
for(int j=1; j*j<=n; j++) //runs O(logn)?  j <= (n)^1/2
    y++; //constant

私の答え:O(logn)

そうでもない。 jはまだ直線的に成長していますが、ループはj2 ≤n。これは、jが√nを超えるとすぐにループが停止することを意味します。したがって、ループの反復はO(√n)のみであり、それぞれがO(1)作業を行うため、実行される作業の合計はO(√n)です。

パート(d)

int b=0; //constant
for(int i=n; i>0; i--) //n times
   for(int j=0; j<i; j++) // runs n+ n-1 +...+ 1. O(n^2) 
      b=b+5;

私の答え:O(n ^ 3)

そうでもない。実際には、必要な作業の多くを二重にカウントしています。内側のループがn +(n-1)+(n-2)+ ... + 1回実行され、O(n2)回、ただし、外側のループのすべての繰り返しで既に要約しています。その値にO(n)をもう一度掛ける必要はありません。最も正確な答えはO(n2)。

パート(e)

int y=1;
int j=0;
for(j=1; j<=2n; j=j+2) //runs n times
   y=y+i;

int s=0;
for(i=1; i<=j; i++) // runs n times
   s++;

私の答え:O(n)

うん!その通りです。

パート(f)

int b=0;
for(int i=0; i<n; i++) //runs n times
    for(int j=0; j<i*n; j++) //runs n^2 x n times? 
       b=b+5;

私の答え:O(n ^ 4)

繰り返しますが、私はあなたが過大評価していると信じています。内側のループは0 + n + 2n + 3n + 4n + ... + n(n-1) = n(0 + 1 + 2 + ... + n-1 )回なので、完了した作業の合計はO(n3)。すべての反復で既に合計しているため、外側のループが実行される回数を掛けるべきではありません。最も正確なランタイムはO(n3)。

パート(g)

int x=0;
for(int i=1; i<=n; i=i*3){  //runs 1, 3, 9, 27...for values of i. 
   if(i%2 != 0) //will always be true for values above
      for(int j=0; j<i; j++) // runs n times
         x++;
 }

私の答え:O(n x log base 3 n?)

ここの外側のループは実際にO(log n)回実行されますが、内側のループがどれだけの作業をするかを見てみましょう。 ifステートメントが常にtrueと評価されることは正しいです。これは、内側のループが1 + 3 + 9 + 27 + ... + 3を実行することを意味しますログ3 n 作業。ただし、この合計は(3ログ3 n + 1 -1)/ 2 =(3n + 1)/2。したがって、ここで行われる作業の合計はO(n)になります。

パート(h)

int t=0;
for(int i=1; i<=n; i++) //runs n times
   for(int j=0; j*j<4*n; j++) //runs O(logn)
      for(int k=1; k*k<=9*n; k++) //runs O(logn)
         t++;

私の答え:n x logn x log n = O(n log n ^ 2)

そうでもない。 2番目のループを見てください。これは、実際には以前の部分の1つと同じロジックを使用してO(√n)回実行されます。 3番目の内部ループもO(√n)回実行されるため、実行される合計作業量はO(n2)。

パート(i)

int a = 0;
int k = n*n;
while(k > 1) //runs n^2
{
    for (int j=0; j<n*n; j++) //runs n^2
       { a++; }
     k = k/2;
}

私の答え:O(n ^ 4)

そうでもない。外側のループは、nに初期化されたkから始まります2、しかし、繰り返しごとにkが半分になることに注意してください。これは、外側のループの反復回数がlog(n2)= 2 log n = O(log n)、したがって外側のループはO(log n)回だけ実行されます。その内側のループはO(n2)動作するため、合計ランタイムはO(n2 ログn)。

パート(j)

int i=0, j=0, y=0, s=0;
for(j=0; j<n+1; j++) //runs n times
   y=y+j; //y equals n(n+1)/2 ~ O(n^2)
for(i=1; i<=y; i++) // runs n^2 times
   s++;

私の答え:O(n ^ 3)

閉じますが、完全ではありません!最初のループは時間O(n)で実行され、完了するまでにjの値はΘ(n2)。これは、2番目のループが時間Θ(n2)、合計時間はΘ(n2)。

パート(k)

 int i=1, z=0;
 while( z < n*(n+1)/2 )//arithmetic series, runs n times
 {
       z+=i; i++;
 }

私の答え:O(n)

そのとおりです!

パート(l)

それは奇妙です、部分(l)はありません。

パート(m)

int a = 0;
int k = n*n*n;
while(k > 1) //runs O(logn) complexity
{
   for (int j=0; j<k; j++) //runs n^3 times
   { a--; }
   k = k/2; 
}

私の答え:O(n ^ 3 log n)

近いが、完全ではない。外側のループはO(log n)回実行され、内側のループはO(n3)最初の反復で動作します。ただし、内側のループの反復回数をより詳しく見てください。

n3 + n3 / 2+ n3 / 4 + n3 / 8 + ...

= n3 (1 + 1/2 + 1/4 + 1/8 + ...)

≤2n3

したがって、ここで行われる合計作業は、実際にはO(n3)、log n回の反復があります。

質問4

あなたの答えはこれらを除いてすべて正しいです:

f)真

これは実際には間違っています。左側の式は

(3/2)n3/2 + 5n2 + lg n

notΩ(n2 √n)=Ω(n5/2

(j)については、ログn6 = 6 log n。それは役立ちますか?

(k)の場合、両側が互いにOとΩであるかどうかを尋ねます。何を見つけますか?

(l)については、ログb c = cログba。それは役立ちますか?

お役に立てれば!

31
templatetypedef