“中的分治法”;R.Java中的Sedgewick算法:第1-4部分“;
在书名的第5章中,描述了在数组中查找最大数的“分而治之”方法,并附下图: 使用的Java代码:“中的分治法”;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; }
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
。请以后使用图像按钮包含图像。谢谢。好吧,我想我明白了)。我的主要误解是数组的类型是双重的,所以我认为索引和数组值是相同的,字母只是为了可视化。谢谢大家的回答。