嵌套for循环的运行时间

时间:2011-01-23 09:55:58

标签: algorithm analysis

1a。)循环在下面,我想找到它的运行时间。这是循环

sum = 0
for (int i =0; i < N; i++){
    for(int j = i; j >= 0; j--)
          sum ++

第一个for循环在O(n)中运行很容易,但是对于第二个我认为它也在O(n)时间运行,因为每当j = i时,这个循环将运行i次。

所以我写下这个有一个O(n ^ 2)的运行时间。

1b中。 )此外,当有问题要求“theta bound”时,有人还可以解释是什么意思吗?

3 个答案:

答案 0 :(得分:7)

嗯,在这里计算出确切的循环迭代次数非常简单。你得到1 + 2 + 3 + 4 + 5 + 6 + 7 + ... + N。

总和为N(N + 1)/ 2,所以是的,算法复杂度为O(N 2 )。

我不能说我遇到了这些界限...... Wikipedia page on big-O notation虽然提到了它,但这可能是一个合理的开始点。

答案 1 :(得分:3)

Theta bound意味着它是一个紧密的渐近界限,它限制了从上到下的运行时间。在您的示例中,N ^ 2是运行时间的下限和上限,因此它是运行时间的θ限制。

更正式:

存在k1和k2,使得:

N ^ 2 * k1&lt; = N(N + 1)/ 2&lt; = N ^ 2 * k2

对于N&gt;一些值N0。

聚苯乙烯。本书对不同的渐近边界给出了很好的解释:http://www.amazon.com/Introduction-Algorithms-Third-Thomas-Cormen/dp/0262033844/ref=sr_1_1?ie=UTF8&qid=1295777605&sr=8-1

答案 2 :(得分:1)

f(n) = O(g(n))当且仅当足够大n时,c存在常量f(n) <= c*g(n)。基本上,big-O表示法给你一个上限。您也可以说您的计划在O(n^3)O(n^2011)甚至O(n^42142342)中运行,但这些对您没有多大帮助,是吗?

Theta表示法为您提供了界限,这更有帮助。 f(n) = Theta(g(n))当且仅当足够大n存在常量c1, c2c1*g(n) <= f(n) <= c2*g(n),这意味着您知道算法与其成正比的确切函数。

您的算法执行1 + 2 + 3 + ... + N次操作,总计N(N+1)/2。这是Theta(N^2),因为N^2/4 + N/4 <= N^2/2 + N/2 <= N^2 + N。因此,您可以将上述定义中的c1c2设为1/22

大多数时候人们会使用big-O表示法来表达紧张,但这不是必需的。当被要求提供函数的big-O时,总会有多个答案,但是当被要求提供theta界限时,只有一个答案。