2016-03-23 133 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