按操作顺序总共打印了多少颗恒星?

时间:2016-05-28 23:32:25

标签: algorithm time-complexity

序列总共打印了多少颗星星 经营:

A a = new A(); for (int i=0; i<N; ++i) a.f(N);

class A
{
  int k = 0;
  void f(int N)
  {
    if (k == 0)
    {
      k = N;
      for (int i = 0; i<N; ++i) StdOut.print("*");
    }
      k = k-1;
      StdOut.print("*");
  }
}

这个问题的答案不是O(n)吗?我不确定为什么,但这对我来说似乎是正确的 - 当我查看代码时。似乎方法f中的for循环仅在第一次调用 aF(N)时运行,因为if语句 if(k == 0) - 如果第一个for循环是:for(int i = 0; i &lt; = N; ++ i)然后我认为答案是O(n ^ 2)。

1 个答案:

答案 0 :(得分:0)

确实,方法的for循环仅在第一次调用时运行并打印 N 星号。每次通话(也是第一次)也会打印一个星号,因此星号总数 2N ,即 O(n)

如果顶部循环会一直运行直到 N 包含在内,那么 k 会在最后一次额外调用时为0,因此它就像第一次调用一样:<打印强> N 额外星号,以及为任何通话打印的星号。

这使 3N + 1 星号仍然 O(n)

代码段(JavaScript)

&#13;
&#13;
var N = 200;
var a = new A(); 
for (var i=0; i<N; ++i) a.f(N);
console.log('asterisks: ', a.count);

function A() {
  var k = 0;
  this.count = 0; 
  this.f = function(N)
  {
    if (k == 0)
    {
      k = N;
      for (var i = 0; i<N; ++i) this.count++;
    }
    k = k-1;
    this.count++;
  };
}
&#13;
&#13;
&#13;

输出 400 N = 200

相关问题