理解大哦

时间:2016-09-26 18:59:03

标签: java big-o

我在理解Big Oh时遇到了很多麻烦。

我很确定以下代码是O(N)。

public static int two1 (int n) {
  if (n == 0) {
   return 1;
  } else {
   return 2 * two1(n - 1);
  }
}

在第二个例子中,我完全迷失了。有人可以向我解释这会是什么符号吗?

public static int two2 (int n) {
  if (n == 0) {
   return 1;
  } else {
   return two2(n - 1) + two2(n - 1);
  }
}

3 个答案:

答案 0 :(得分:0)

当n = 0时,需要1步。 当n = 1时,需要1 + t(0)+ t(0)= 1 + 1 + 1 = 3步。 当n = 2时,需要1 + t(1)+ t(1)= 1 + 3 + 3 = 7步。 当n = 3时,需要1 + t(2)+ t(2)= 1 + 7 + 7 = 15步。

这只是2 ^ n - 1,所以O(2 ^ n)。

答案 1 :(得分:0)

O符号等于答案。 O(fib(n))你最终将所有的计算都转换为1 + 1 + 1 + 1 + 1 + .... 1来得到答案,这也是顺序。

fib(n)大约是golden ratio^n(1+sqrt(5))/2 ^ n。

答案 2 :(得分:0)

这将是O(2 ^ n)

想一想。第一个,取输入的n。说你输入了k。这将需要k步。如果输入2 + 1,则需要k + 1步。如果输入2k,则需要两倍的时间。

在第二个例子中,如果您输入3例如,则必须计算two2(2)+ two2(1)。如果输入4,则必须完成2(3)的所有工作和2(2)的所有工作。

为了更好地说明,想想two2(100)。这将需要two2(99)+ two2(98)。双方的规模相对相似。如果你不得不做两个(101),你必须做大约两倍的工作。

这有帮助吗?

另见:Computational complexity of Fibonacci Sequence