algorithm - hanoi的max、ruler、tower的递归算法分析

标签 algorithm recursion

我有以下 robert sedwick 的 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次方的问题分成两个大小为2的n-1次方的问题来求解的。

我理解 ruler 和 max,但是上面语句中的 towerof hanoi 呢?

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

作者所说的输出大小的线性时间解决方案是什么意思?

最佳答案

对于 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 次移动,这等于你的算法的运行时间,所以你的输出的大小和你的算法的运行时间关系是线性的,事实上

lim n->∞ output / runtime = constant.

这意味着算法的运行时间与输出呈线性关系(但正如您所见,它与输入的关系是指数关系)。

同样,在再次寻找最大值时,您可以使用这样的 lim 来说明它与输入具有线性关系。

关于algorithm - hanoi的max、ruler、tower的递归算法分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12319030/

相关文章:

c# - 计算日期时间列表中的总分钟数

algorithm - 合并 'spatial' 元组列表

c++ - 通过模板函数重载以正向顺序进行模板递归(关于 std::tuple 的迭代)

python - leetcode 爆破气球超时

java - 为什么这个递归 Java 程序不能正确地反转文本文件中的行

algorithm - 如何在集群中运行的节点中选举主节点?

c++ - 计算合并排序算法的交换/比较次数

algorithm - 这个用于计算组合的天真代码的大 O 复杂度是多少?

java - 辅助方法中的递归 (Java)

algorithm - 如何编写用于生成集合的所有子集的迭代算法?