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

“中的分治法”;R.Java中的Sedgewick算法:第1-4部分“;,java,algorithm,search,Java,Algorithm,Search,在书名的第5章中,描述了在数组中查找最大数的“分而治之”方法,并附下图: 使用的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; }

在书名的第5章中,描述了在数组中查找最大数的“分而治之”方法,并附下图:

使用的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。 我说得对吗

此外,书中进一步描述的错误如下:


请澄清我对递归的理解可能有什么错误。

首先:代码使用了
双精度
,示例似乎使用了
字符
,因此示例和代码没有完全对齐


第二:在
max(l,r)
中,
l
r
被索引到数组中,而不是实际值。比较值为
T
I
。在我的ASCII表和字母表中,
I
位于
T
之前,因此
I
被认为比
T
小。所以两者的最大值都是
T

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

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

我希望这能为你澄清一些事情

我认为这幅画不正确。例如,带有(0,1)即T max(0,1)的方法调用应该返回i not T。对吗

没有


调用
max(A,0,1)
赋值
m=0
,然后递归调用
max(A,0,0)
max(A,1,1)
。值
u
v
分别为
'T'
'I'
,其中最大值为
'T'
。。。返回值。

我有点惊讶为什么他使用了一个包含的上界-虽然在这个例子中,它一般不太重要,但我认为它更复杂(也许我刚刚习惯了这个惯例)。无论如何,您的代码中有一个错误:
(l+r)/2
受到溢出的影响,因此您应该始终使用
l+(r-l)/2
。请以后使用图像按钮包含图像。谢谢。好吧,我想我明白了)。我的主要误解是数组的类型是双重的,所以我认为索引和数组值是相同的,字母只是为了可视化。谢谢大家的回答。