作为旁注,通常将指数时间写成O(2
n),因为N可以乘以常数以实现另一个指数(2n
),n的系数通常被认为是与大符号无关的。但是,在比较指数算法时考虑指数级的大型OS的不同基础绝对有用。
ok,因此,如果我迅速简化了功能,因此删除了恒定的时间操作:
void g(int n) // O(2^n)??? function A
{
if(n <= 1) return;
g(n - 1);
g(n - 2);
g(n - 2);
return;
}
void g(int n) // O(3^n) function B
{
if(n <= 1) return;
g(n - 1);
g(n - 1);
g(n - 1);
return;
}
然后为每个函数创建呼叫计数器(计数包括初始基本呼叫):
int countCallsA(int n, int calls = 1) // for function A
{
if(n <= 1) return calls;
return countCallsA(n - 1, calls) + 2 * countCallsA(n - 2, calls);
}
int countCallsB(int n, int calls = 1) // for function B
{
if(n <= 1) return calls;
return 3 * countCallsB(n - 1, calls);
}
现在,很明显,对于正面,n
实际上是执行简单的启动countCallsB
n)时间。
对于
3^(n - 1)
,我们得到一系列结果,可以由
定义 un
=un-1
+2un-2,对于n≥3,其中u1= 1 andu
2
= 4,其中u
countCallsA
.
如果un-1和un-2被取代,直到给定的n剩下任何东西(第一步将给出
unn-3+ 2(un-3
+2un-4)
),然后很明显,所有两者都积聚成2n
是主要的术语。
任何一个直觉的解释,但仅出于完整性,解决递归公式就可以提供
un=2n + 0.5(-1)n-0.5,证明它以o(2n
)时间运行。