如何计算循环中的操作数并给出θ表征

时间:2010-09-28 22:31:14

标签: java count

我只是想确定我这样做是否正确。我试图计算在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,这个等式是否仍然如上所述或改变?

4 个答案:

答案 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 ++操作量:

  • 当i == 0时:执行零sum++
  • 当i == 1时:只有一个sum++被执行(当a == 0时)。
  • 当i == 2:2 sum++ s(a == 0和a == 1)时
  • 当i == 3:3 sum++ s(a == 0,a == 1和a == 2)时
  • ...
  • 当i == n-1:n-1 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))。