4

Big O表記を使用してforループの複雑さを理解しようとしています。以前に他のクラスでこれを行ったことがありますが、これは実際のアルゴリズムに基づいているため、他のクラスよりも厳密です。コードは次のとおりです。

for(i=n ; i>1 ; i/=2) //for any size n
{
    for(j = 1; j < i; j++)
    {
      x+=a
    }
}

for(i=1 ; i<=n;i++,x=1) //for any size n
{
    for(j = 1; j <= i; j++)
    {
      for(k = 1; k <= j; x+=a,k*=a)
      {

      }
    }
}

最初のループは、リストを n 回通過するため、O(n) の複雑さであることがわかりました。2 番目のループについては、少し迷っています。分析にご協力いただきありがとうございます。各ループは独自の空間にあり、一緒ではありません。

4

3 に答える 3

1

次のように正式に進めることができます。

フラグメント 1:

ここに画像の説明を入力

フラグメント 2 (Pochhammer、G 関数、およびスターリングの近似) :

ここに画像の説明を入力

log(G(n))で。

[フラグメント 2 の更新] :

Johann Blieberger 博士による「DISCRETE LOOPS AND WORST CASE PERFORMANCE」出版物からのいくつかの機能強化 (すべてのケースがa = 2で検証済み):

ここに画像の説明を入力

どこ:

ここに画像の説明を入力

ここに画像の説明を入力

ここに画像の説明を入力

したがって、

ここに画像の説明を入力

于 2014-04-09T20:03:23.357 に答える
0

編集: 最初のコード ブロックがO ( n )であることに同意します

i外側のループを 2 で割ることによってデクリメントし、内側のループで時間を実行iすると、反復回数は、N 以下で 0 より大きい 2 のべき乗すべての合計になります。つまり、n log( n)+1 - 1 なので、O (n) です。

2 番目のコード ブロックはO (log a (n)n 2 )aであり、 は定数であると仮定します。

最も外側の 2 つのループは、n 以下のすべての数の合計 (n(n-1)/2) に等しいため、O (n 2 ) になります。最後に、内側のループは n の上限よりも小さい a の累乗であり、これはO (log a n) です。

于 2013-05-24T21:18:30.880 に答える