【问题标题】:Recurrence Relations with Multiparameter Functions多参数函数的递归关系
【发布时间】:2021-03-12 08:04:51
【问题描述】:

我一直试图围绕递归关系的概念展开思考,并了解如何划分、征服和组合。我不明白的是如何从处理一组值、最低索引和最高索引的多参数函数中导出正确的递归关系。

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

我的递归情况是当 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, l, q);
 if (max1 >= max2 && max1 >= max3) {
   return max1;
 } else if (max2 >= max1 && max2 >= max3) {
  return max2;
 } else {
   return max3;
 }
}

我不确定我会怎么做。从我看到的每个示例中,我应该使用 n 作为我的输入大小,我关心的唯一参数是我的输入大小。

有人能解释解决几乎所有算法的最佳方法吗?我觉得这种特殊的类型越来越吸引我,因为我习惯于在递归关系背后的解释中看到更简单的递归函数。

【问题讨论】:

  • 您能解释一下您要实现的算法吗?
  • 是的,这只是一个示例,而且写得不好。此函数将数组、最低和最高索引作为参数。它找到数组的各个子集的最大值。然后比较它找到的三个最大值,并确定三个最大值中的最大值。
  • 你的意思是算法通过分治策略在数组中搜索最大值?
  • 是的,简单地说。

标签: java recursion discrete-mathematics recurrence


【解决方案1】:

在这样的情况下,我看到函数的输入大小被认为不是文字输入大小(在每次递归调用中可能或多或少保持相同),而是正在考虑的数据的有效大小。在您的算法中 - 就像在合并排序中一样 - 正在考虑的数据的有效大小在每次递归调用时都会缩小:您的高索引和低索引限制了您正在查看的数组部分,因此从某种意义上说,您的有效输入大小确实收缩。因此,与其将诸如此类的情况视为多变量递归,我希望使用诸如 T(n) = 3T(n/3) + O(1) 之类的递归,或类似的东西。

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

【讨论】:

    猜你喜欢
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 2016-07-22
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多