2016-03-23 65 views
0

我正在完成我的課程作業,這部分內容涉及對幾個for循環的運行時間進行「分析」。教練指定他想要一個Big Oh Notation答案。這些for循環的大O符號是什麼?

我對總運行時間的基礎上建立的依據是:

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. 

我知道:

total = 0; 

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

答:O(N)的運行線。

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運行時間假設?

+4

第一個以O(n^3)運行,第二個以O(n^2)運行 – Ra1nWarden

+0

這些循環非常簡單,您可以通過實驗獲得它。你可以嘗試不同的'n'值(循環)並推導出訂單。例如嘗試n = 10和n = 20,看看'total'的比例是多少。 –

+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運行時間假設」

這是不正確的:這取決於的迭代是如何增加以及在每個循環的簽名界。比較例如其中內環T_a以上(以n^2爲界,但在每次迭代中僅增加1)或例如the algorithm analyzed in this answer,或者對於稍微棘手的情況,the single loop analyzed in this answer

+0

@SkyZ樂意幫忙。 Sigma符號實際上只是一個有用的工具,用於估計某些給定算法的實際迭代次數,自然會遵循時間複雜度。 – dfri

+0

感謝您向我展示技術,我的教授沒有提到關於西格瑪的任何內容。T除以2來自哪裏(B)? Im與第二個實際上混淆整個T_b – SkyZ

+0

@SkyZ總和規則'sum_ {i = 1}^{n} i = n(n + 1)/ 2'是[標準求和規則](https:/ /en.wikipedia.org/wiki/Summation)。其餘的總和是總和索引中的簡單計數「1」(或「-1」);如果你發現他們難以遵循,那麼可能更容易把握他們坐下來用紙和筆,試圖通過平等遵循平等。 – dfri