内側のループでの反復回数が外側のループの現在の反復によって決定されるネストされたループのビッグ-Oとは何ですか?

StackOverflow https://stackoverflow.com/questions/362059

  •  21-08-2019
  •  | 
  •  

質問

次のネストされたループのビッグ-O時間の複雑さはどのようなものです。

for(int i = 0; i < N; i++) 
{
    for(int j = i + 1; j < N; j++)
    {
        System.out.println("i = " + i + " j = " + j);
    }

}

は、のO(N ^ 2)のまだだろうか?

役に立ちましたか?

解決

うん、それはまだはO(n ^ 2)ですが、それは小さな定数因子を有し、それはO記法に影響を及ぼさない。

他のヒント

はい。ビッグOの定義を思い出してください。のO(F(N))の定義では、/ <実行時間のT(N)の≤のKF(n)のことを言いますem>のいくつかの定数のK のため。この場合には、工程数は(N-1)+(N-2)+ ... + 0 、0-nの1の和に並び替えます。これは、

T(N)=(N-1)((N-1)+1)/ 2

それを並べ替えて、あなたは、のT(N)は常に1/2(n²)≤になることがわかります。定義により、このように T(N)= O(n²)

それはあなたがするSystem.out.printlnを無視した場合Nの二乗です。あなたはそれにかかる時間は、その出力(それももちろん、ないかもしれない)で線形されると仮定した場合、私はあなたがOで終わる疑い((N ^ 2)* Nを記録)。

私は選り好みするが、ちょうどあなただけの複雑さが出て作業するときに考慮に明白なループを取る必要がないことを指摘していないこれを言及 - あなたはあなたにも呼んの複雑さを見てする必要があります

はい、それはNの二乗になります。私は間違っていない場合は、^ 2 - ステップの実際の数は0.5であるN、1の合計*(1 N)だろう。ビッグOは、唯一のアカウントに最高exponantなしの定数をとり、したがって、これはNの二乗まだあります。

は、N = 10であった場合、反復があろう:10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1。 (これは次のとおりです。10回の反復プラス9回の反復プラス8回の繰り返し...等)。

さて、あなたはN(例では10)を得ることができますどのように多くの時間以外に確認する必要があります:

1:(10)、2(9 + 1)、3(8 + 2)、4:(7 + 3)、5(6 + 4)。これは... 5回で、5回の反復を載せています。

さて、あなたは5十+ 5を持っていることを知っています

10(5)+ 5

F(N)(またはN)の面で、我々は簡単にこれがあろうことを確認できます:

F(N)= N(N / 2)+ N / 2 =(N ^ 2)/ 2 + N / 2 =(N ^ 2 + N)/ 2 ...これは正確にこれらの複雑さでありますネストされたループます。

しかし、ビッグOの漸近挙動を考慮すると、我々は、単一のnと分母あるFの下位値(n)は、取り除くことができます。

結果:O(N ^ 2)

外側のものを介して内側ループから開始される

AFAILは、ネストされたループの複雑さを計算するための適切な方法です。 loading="lazy" "ここに画像の説明を入力し、"

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top