我在理解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);
}
}
答案 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),你必须做大约两倍的工作。
这有帮助吗?