多参数函数的递归关系

问题描述

我一直试图围绕递推关系的概念进行思考,我看到了如何划分、征服和组合。我无法理解的是如何从处理值数组、最低索引和最高索引的多参数函数中推导出正确的递推关系。

更多背景: 我的基本情况是最低指数等于最高指数。当满足该条件时,我从最低索引返回元素。 (也是最高的)它是唯一的元素。

我的递归情况是 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) 或类似性质的递归。

现在,有些函数具有多个自变量是有意义的……例如,一个函数接受两个数组并以不同的速率缩小范围。图算法通常(尽管并非总是)将顶点和边视为复杂性边界的独立变量,作为一个具体案例。在这些情况下,自变量被认为是真正独立变化的,不能有意义地组合成有效大小的单一度量。在您的函数中不一定是这种情况。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...