我在罗伯特塞德威克的C ++算法中有以下问题
Item max(Item a[], int l, int r){
if (l == r) return a[l];
int m = (l+r)/2;
Item u = max(a, l, m);
Item v = max(a, m+1, r);
if (u > v)
return u;
else
return v;
}
以下是河内塔的节目
void hanoi(int N, int d)
{
if (N == 0) return;
hanoi(N-1, -d);
shift(N, d);
hanoi(N-1, -d);
}
以下是标尺程序
void rule(int l, int r, int h)
{ int m = (l+r)/2;
if (h > 0)
{
rule(l, m, h-1);
mark(m, h);
rule(m, r, h-1);
}
}
上述三个问题通过将大小为2的问题分解为n-1的幂来解决大小为2的问题。
我理解为统治者和max,但是对于上面的声明中的河内塔怎么样?
在分析上述进展时,作者提到,为了找到最大值,我们在输入的大小上有线性时间解;对于绘制标尺和求解塔,我们在输出的大小上有线性时间解决方案。
作者在上面的输出大小的线性时间解决方案中意味着什么?
答案 0 :(得分:1)
对于honoi塔,你的递归算法是(H(1)= 1):
H(n)= 2 H(n-1)+ 1 = 2 ^ 2H(n-2)+ 2 + 1 .... = 2 ^(n-1)H(1)+ 2 ^( N-2) + ... + 1 = 2 ^(n-1)+ 2 ^(n-2)+ ... + 1 = 2 ^ n - 1.
但是honoi塔的解决方案应该打印2 ^ n - 1次移动,这等于算法的运行时间,因此输出的大小和算法关系的运行时间是线性的,实际上< / p>
lim n-&gt;∞输出/运行时=常量。
这意味着算法的运行时间与输出呈线性关系(但是你可以看到它与输入的关系是指数的)。
同样在再次找到最大值时,您可以使用这样的lim
来表示它与输入具有线性关系。