问题描述
我一直试图围绕递推关系的概念进行思考,我看到了如何划分、征服和组合。我无法理解的是如何从处理值数组、最低索引和最高索引的多参数函数中推导出正确的递推关系。
更多背景: 我的基本情况是最低指数等于最高指数。当满足该条件时,我从最低索引返回元素。 (也是最高的)它是唯一的元素。
我的递归情况是 q 和 p 不相等。代码如下:
int maximum(int[] A,int p,int q) {
if (p == q) {
return A[p];
}
int k,l,max1,max2,max3;
k = p + Math.floor((q-p+2)/3);
l = k + Math.floor((q-p+2)/3);
max1 = maximum(A,p,k-1);
max2 = maximum(A,k,l-1);
max3 = maximum(A,q);
if (max1 >= max2 && max1 >= max3) {
return max1;
} else if (max2 >= max1 && max2 >= max3) {
return max2;
} else {
return max3;
}
}
我不确定我会怎么做。从我看到的每个例子来看,我应该使用 n 作为我的输入大小,我唯一关心的参数是我的输入大小。
有人能够解释解决几乎任何算法的最佳方法吗?我觉得这种特殊类型对我很有吸引力,因为我习惯于在递归关系背后的解释中看到更简单的递归函数。
解决方法
在这样的情况下,我看到函数的输入大小被认为不是文字输入大小(在每次递归调用时可能或多或少保持不变),而是所考虑的数据的有效大小。在您的算法中 - 就像在合并排序中一样 - 所考虑的数据的有效大小在每次递归调用时都会缩小:您的高低索引限制了您正在查看的数组部分,因此从某种意义上说,您的有效输入大小确实如此收缩。因此,与其将此类情况视为多变量递归,我更希望出现 T(n) = 3T(n/3) + O(1) 或类似性质的递归。
现在,有些函数具有多个自变量是有意义的……例如,一个函数接受两个数组并以不同的速率缩小范围。图算法通常(尽管并非总是)将顶点和边视为复杂性边界的独立变量,作为一个具体案例。在这些情况下,自变量被认为是真正独立变化的,不能有意义地组合成有效大小的单一度量。在您的函数中不一定是这种情况。