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”时,有人还可以解释是什么意思吗?
答案 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, c2
时c1*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
。因此,您可以将上述定义中的c1
和c2
设为1/2
和2
。
大多数时候人们会使用big-O表示法来表达紧张,但这不是必需的。当被要求提供函数的big-O时,总会有多个答案,但是当被要求提供theta界限时,只有一个答案。