2016-03-23 12 views
0

私はクラスの課題を仕上げていますが、この特定のセクションではいくつかのforループの実行時間の「分析」を行います。指導者はビッグ・オノー表記の答えが必要だと指定しました。これらのforループのBig O表記法とは何ですか?

total = 0; 

    for (int i = 0; i < n;i++){ 
    total++; 
} 

は、回答::O(N)その実行の線形私がいることを知っている

1)The cost of executing each statement 
2)The frequency of execution of each statement 
3)The idea of working from "inside and out", specifically starting from inner loops. 

私は時間を実行している合計基盤の上に構築していますがに基づいています。

for (int i = 0; i < n;++i) 
    for (int j = 0; j < n;++j) 
    total++; 

回答:O(N^2)は、Nがどれだけ大きくなるかだけを気にします。

私は

for (int i = 0;i < n;++i) 
    for (j=0;j < n * n;++j) 
    ++total; 

for (i = 0;i < n;++i) 
    for (j = 0; j < i;++j) 
    ++total; 

そして最後に混乱していなく、少なくとも、私はすべてのトリプルネストされたループがNに^ 3時間を実行していることを私の教科書から想定していますか?

あなたのアルゴリズムのforループの内側で実行反復回数/カウント拡大して、シグマの表記を使用してアルゴリズムを解析することができ
+4

最初のものはO(n^3)で実行され、2番目のものはO(n^2)で実行されます – Ra1nWarden

+0

これらのループは簡単に実験で取得できます。異なる 'n '値を(ループで)試して、順序を推論することができます。例えばn = 10とn = 20を試して、「合計」の割合が何であるかを見てください。 –

+0

より正確に最後のものは '=(n *(n-1))/ 2 =(n^2 - n)/ 2€O(n^2)' – Rocki

答えて

4

enter image description here

T_a

for (i = 0; i < n; ++i) 
    for (j = 0; j < n * n; ++j) 
     ++total; 

カバーおよびT_b

for (i = 0; i < n; ++i) 
    for (j = 0; j < i; ++j) 
     ++total; 

最後に、あなたの質問に注記:

「そして最後にではなく、少なくとも、私はすべての トリプルネストされたループがN^3時に実行されているというのが私の教科書から想定しています?」

これは真実ではない:それは反復がを増加させるだけでなく、が各ループの署名に有界方法に依存します。例:内ループはで囲まれているが、各反復では単に1だけ増加している。 the algorithm analyzed in this answer、またはややトリッキーな場合はthe single loop analyzed in this answerです。

+0

です。シグマ表記法は実際には、あるアルゴリズムの実際の反復回数を見積もるための単なる参考ツールです。この複雑さから、時間の複雑さが自然に発生します。 – dfri

+0

テクニックを教えてくれてありがとう、私の教授はシグマについて何も言及していませんでした。2で割り切れるのはT(B)のどこから来ますか? 2番目のものと実際には混同しています – SkyZ

+0

@SkyZ合計ルール 'sum_ {i = 1}^{n} i = n(n + 1)/ 2'は[標準集計ルール]です(https: /en.wikipedia.org/wiki/Summation)。残りの合計は、合計索引付けに対して「1」(または「-1」)の単純なカウントです。あなたがそれらを追跡することが困難であることが分かったら、平等によって平等に従うことを試み、紙とペンで座っているそれらを把握するのはおそらくもっと簡単でしょう。 – dfri

関連する問題