我想对O(N)函数做一些说明。我正在使用SICP。递归算法中的基本情况和时间复杂度
考虑,在伪代码生成一个递归过程书中的阶乘函数:
function factorial1(n) {
if (n == 1) {
return 1;
}
return n*factorial1(n-1);
}
我不知道如何来衡量的步数。也就是说,我不知道如何“一步”的定义,所以我用的语句从书中定义步:
因此,我们可以计算N!通过计算(n-1)!并将 结果乘以n。
我认为这是他们的意思一步。对于一个具体的例子,如果我们跟踪(阶乘5),
- 阶乘(1)= 1 = 1步骤(基础案例 - 恒定的时间)
- 阶乘(2)= 2 *阶乘(1)= 2步骤
- 阶乘(3)= 3 *阶乘(2)= 3步
- 阶乘(4)= 4 *阶乘(3)= 4步
- 阶乘(5)= 5 *阶乘(4) = 5步
我认为这确实是线性的(数字的步骤与n)成正比。
另一方面,这里是另一个因素,我看到的基本情况略有不同。
function factorial2(n) {
if (n == 0) {
return 1;
}
return n*factorial2(n-1);
}
这是完全一样的第一个,除了另一个计算(步骤)加入:
- 阶乘(0)= 1 = 1步骤(基础案例 - 恒定的时间)
- 因子(1)= 1 *阶乘(0)= 2个步骤
- ...
现在我相信这仍然是O(N),但我是正确的,如果我说factorial2更像O(n + 1)(其中1是基本情况),而不是恰好为O(N)的factorial1(包括基本情况)?
Big-O符号只关心最高级别。 O(n + 1)不存在,它是O(n)。 – Eric
@Eric O(N + 1)确实存在。是O(n + 1)等同于O(n),但是大O的定义中没有任何内容指定O(n + 1)比O(n)更不有效。 O(n)显然是更常见的形式,因为它很方便。你说的有点像说2/4不存在,因为它真的是1/2。 – gbtimmon