大估计的麻烦

时间:2014-02-11 04:38:34

标签: big-o

我被要求对某些代码进行大估计,但我遇到了一些麻烦

int sum = 0;
for (int i = 0; i < n; i = i + 2) {
   for (int j = 0; j < 10; j + +)
      sum = sum + i + j;

我认为最坏的情况是O(n / 2),因为外部for循环是从i到数组长度n。但是,我不确定内循环是否会影响Big O.

int sum = 0;
for (int i = n; i > n/2; i − −) {
   for (int j = 0; j < n; j + +)
      sum = sum + i + j;

对于这个,我认为它将是O(n ^ 2/2),因为内部循环是从j到n而外部循环是从n到n / 2,这给了我n *(n / 2)

int sum = 0;
for (int i = n; i > n − 2; i − −) {
   for (int j = 0; j < n; j+ = 5)
      sum = sum + i + j;

我很沮丧。我的猜测是O(n ^ 2-2 / 5)

3 个答案:

答案 0 :(得分:2)

你没有运行嵌套循环:

for (int i = 0; i < n; i = i + 2);
                                 ^----

该分号正在终止循环定义,因此i循环仅从0开始计算 - &gt; n,以2为步,不做任何事情。 j循环完全独立于i循环 - 两者都只依赖于n执行时间。

答案 1 :(得分:2)

  

对于上述算法,最坏情况/最佳情况是相同的   在Big O表示法的情况下,可以忽略低阶项和最高阶项的系数,因为Big O用于描述渐近上限。

int sum = 0;
for (int i = 0; i < n; i = i + 2) {
   for (int j = 0; j < 10; j + +)
      sum = sum + i + j;

外循环迭代的总数= n / 2.对于外循环的每次迭代,内循环迭代的数量= 10.so内循环迭代的总数= 10 * n / 2 = 5n。很明显是O(n)。 现在考虑休息两个程序并自己确定时间复杂性。

答案 2 :(得分:2)

前两个示例的运行时间是正确的。

对于第一个例子,内循环当然总是执行10次。所以我们可以说总运行时间是O(10n / 2)。

对于最后一个例子,外循环只执行两次,内循环n/5次,所以总运行时间为O(2n / 5)。

请注意,由于定义了大O复杂度的方式,常数因子和渐近较小的项可忽略不计,因此您的复杂性可以/应该简化为:

  • O(n)的
  • 为O(n 2
  • O(n)的

如果你要考虑常数因素(当然使用大O符号以外的东西 - 也许是~-notation),你可能必须明确一个工作单元的构成 - 也许{{1由于有2个加法运算,所以构成2个工作单元而不是1个单元。