河内最大,直尺和塔的递归算法分析

时间:2012-09-07 13:25:49

标签: algorithm recursion

我在罗伯特塞德威克的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,但是对于上面的声明中的河内塔怎么样?

在分析上述进展时,作者提到,为了找到最大值,我们在输入的大小上有线性时间解;对于绘制标尺和求解塔,我们在输出的大小上有线性时间解决方案。

作者在上面的输出大小的线性时间解决方案中意味着什么?

1 个答案:

答案 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来表示它与输入具有线性关系。