我只是想确定我这样做是否正确。我试图计算在java
中为最坏情况场景执行的操作数int sum = 0;
for (int i = 0; i < n; i++ )
sum++;
操作次数是2 + 3n还是3 + 3n?
我得到的答案是从计算int sum = 0和int i = 0得到“2”并且i&lt; n,i ++和sum ++为“3n”。或者它是3而不是2因为我必须计算i&lt; n在经历循环之前?
但不管怎样,theta表征是Θ(n)?
现在如果有这样的嵌套for循环怎么办:
int sum = 0;
for (int i = 0; i < n; i++ )
for (int a = 0; a < i; a++)
sum++;
是3 + n *(6a + 2)= 6na + 2n + 3?用Θ(n ^ 2)?
如果我从&lt;更改内部for循环我到了&lt; i * i,这个等式是否仍然如上所述或改变?
答案 0 :(得分:4)
如果每行只有一个,那么计算每个语句的执行次数可能更容易:
int sum = 0; // 1 time
int i = 0; // 1 time
while (i < n) { // n+1 times
sum++; // n times
i++; // n times
}
因此,T(n) = 3*n+3 = Θ(n)
。
int sum = 0; // 1 time
int i = 0; // 1 time
while (i < n) { // n+1 times
int a = 0; // n times
while (a < i) { // 1 + 2 + ... + n = n*(n+1)/2 times
sum++; // 0 + 1 + ... + n-1 = n*(n-1)/2 times
a++; // 0 + 1 + ... + n-1 = n*(n-1)/2 times
}
i++; // n times
}
因此,T(n) = 3*n+3 + n*(n-1) + n*(n+1)/2 = Θ(n^2)
。
答案 1 :(得分:1)
是的,确切地说。查看here以获得数学定义。
使用2 + 3n或3 + 3n无关紧要。你有lim_n-&gt; infty((3 + 3n)/ n)= 3(lim sup和lim inf在这里是相同的)。由于这个限制(大于0而不是无穷大),你知道那就是Big Theta n。
在第二个示例中,您不能使用内循环变量(a或i)。 sum ++操作量:
sum++
。sum++
被执行(当a == 0时)。sum++
s(a == 0和a == 1)时sum++
s(a == 0,a == 1和a == 2)时sum++
s(a == 0,a == 1,...最后a == n-1)您的代码中都是sum++
。所以让我们把它们加在一起:
0 + 1 + 2 + ... + n - 1
与(n-1)(n-2)/ 2相同。
即。我们有Θ(n ^ 2 + n)。同样的事情对于++和&lt;我(嗯,还有一个确切但无关紧要)。 i ++ ops的数量只是n。所以你最终得到Θ(n ^ 2)。
答案 2 :(得分:0)
它将是3 + 3n,因为比较针对i
的每个值从0到n
包含。我说那是O(n)。
答案 3 :(得分:0)
我将其视为3+3n
,因为当n = 0
时,您执行以下3个命令:
int sum = 0;
int i = 0;
i < n
现在当n != 0
然后你执行一次声明(2
)并且每次执行循环时每个命令一次(3n
)和最后的比较(失败; {{ 1}})。这使得1
。
是的,那将是Θ(n)(和O(n)和o(n))。