“Java中的R. Sedgewick算法:第1-4部分”中的分治方法

时间:2011-10-22 09:22:19

标签: java algorithm search

在标题书的第5章中,描述了“分而治之”的方法,用于查找数组中的最大数字,并附上以下图像:

enter image description here

使用的Java代码:

static double max(double a[], int l, int r)
{
    if (l == r) return a[l];
    int m = (l+r)/2;
    double u = max(a, l, m);
    double v = max(a, m+1, r);
    if (u > v) return u; else return v;
}

我认为图片不正确。例如,使用(0,1)进行方法调用,即T max(0,1)应该返回I而不是T. 我是对的吗?

书中的其他图片也是错误的:

three tree models

请澄清我对递归的理解可能有问题。

3 个答案:

答案 0 :(得分:1)

第一张图片中显示的示例是返回数组中的最高字母,而不是数字。显示的数字表示每个字母的数组索引。因为T>我,max(0,1)返回T.算法的整体返回值为Y,因为它是所有这些中最高的字母。

在第二张图片中,第一棵树的每个节点似乎是其直接子节点的总和;第二棵树的每个节点看起来都是其直接子节点平均值的最低点;第三棵树基本上显示了你的第一张照片。

我希望这能为你澄清事情!

答案 1 :(得分:0)

首先:代码使用double,示例似乎使用了char,因此示例和代码未完全对齐。

第二:在max(l, r)中,lr会对数组产生影响,而不是实际值。比较值为TI。在我的ASCII表格上,我的字母I出现在T之前,因此I小于T。所以两者的最大值是T

答案 2 :(得分:0)

  

我认为图片不正确。例如,用(0,1)进行方法调用,即T max(0,1)应该返回I而不是T.我是对的吗?

没有

致电max(a, 0, 1)分配m = 0,然后递归调用max(a, 0, 0)max(a, 1, 1)。值uv分别为'T''I',其中最大值为'T' ...将返回。