当前位置: 首页 > 知识库问答 >
问题:

如何用分治法解决“固定大小最大子数组”?

沈龙光
2023-03-14

免责声明:我知道这个问题可以通过数组的单次传递非常有效地解决,但我对用分而治之法做这个很感兴趣,因为它与我们用分而治之法处理的典型问题有点不同。

假设给定一个浮点数组x[1:n],大小为n,间隔长度为l。问题是设计一个分治算法,从具有最大和的数组中找到长度为l的子数组。

现在,为了将问题分成两半,我决定在n-l+1/2处中断数组,以便将相等数量的子数组分配到我的除法的两半,如下面的算法所示。同样,对于n=10,l=3,n-l+1=8,所以我把问题分解为(n-l+1)/2=4。但是对于第四个子阵列,我需要多达6个阵列元素,即(n+l-1)/2。

void FixedLengthMS(input: X[1:n], l, output: k, max_sum)
{
   if(l==n){//only one sub-array
      sum = Sumof(X[1:n]);
      k=1;
   }
   int kl, kr;
   float sum_l, sum_r;
   FixedLengthMS(X[1:(n+l-1)/2], l, kl, sum_l);
   FixedLengthMS(X[(n-l+3)/2:n], l, kr, sum_r);

   if(sum_l >= sum_r){
      sum = sum_l;
      k = kl;
   }
   else{
      sum = sum_r;
      k = n-l+1/2 + kr;
   }
}

注意:为了清除子数组(n-l+1)/2开始的数组索引,我们需要数组元素(n-l+1)/2+l-1=(n+l-1)/2

我的关注:为了应用分而治之,我在两个数组中都使用了一些数据元素,所以我正在寻找另一种避免额外存储的方法。

共有1个答案

司空赞
2023-03-14

你不需要分而治之。一个简单的一次通过算法可以用于该任务。让我们假设,这个数组足够大。然后:

double sum = 0;
for (size_t i = 0; i < l; ++i)
    sum += X[i];

size_t max_index = 0;
double max_sum = sum;

for (int i = 0; i < n - l; ++i) {
    sum += X[i + l] - X[i];
    if (sum > max_sum) {
        max_sum = sum;
        max_index = i;
    }
}
 类似资料:
  • 对不起,我有一个任务要用蛮力算法O(n^2)、分治算法O(nlogn)和Kadane算法O(n)来解决最大子数组问题。(我的代码不同)。

  • 对于使用分治方法的最大和子数组算法,我需要返回和和子数组。 我能在所有的测试中正确地计算和。然而,我无法计算出正确的子数组。 我的总数(正确):34 阵列:2 9 8 6 5-11 9-11 7 5-1-8-3 7-2 正确子数组:2 9 8 6 5 我的总数(正确):50 阵列:31-41 59 26-53 58 97-93-23 84 正确子数组:59 26-53 58 97 我的总数(正确)

  • 问题内容: 因此,我正在从Web服务加载图像,但是图像的大小有时小于或大于其他图像,当我将其放入android的ListView中时,可视化效果看起来很愚蠢。我想固定ImageView的大小,以便仅在图像大小大于预设值时才显示图像的一部分。我已经尝试了所有可以想到的设置setMaxWidth / setMaxHeight,将比例类型设置为centerCrop,使用ClipableDrawable包

  • 本文向大家介绍在C ++中使用分而治之算法的最大子数组总和,包括了在C ++中使用分而治之算法的最大子数组总和的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个带有正值和负值的数据列表。我们必须找到其总和最大的连续子数组的总和。假设列表包含{-2,-5,6,-2,-3,1,5,-6},则最大子数组的总和为7。它是{6,-2,-3的总和,1,5} 我们将使用分而治之方法解决此问题。步骤如下所示

  • 问题内容: 在Swift中,我试图创建一个由64个SKSpriteNode组成的数组。我想先将其初始化为空,然后将Sprites放在前16个单元格中,然后将最后16个单元格中(模拟象棋游戏)。 根据我在文档中了解的内容,我期望会出现以下情况: 要么 但这是行不通的。在第二种情况下,我收到一条错误消息:“尚不支持定长数组”。那可以是真的吗?对我来说,这听起来像是一项基本功能。我需要通过它们的索引直接

  • 给定一个正负整数数组,如何找到长度在和之间的最大和子数组(连续子数组)? 例如:如果数组是 我的方法: 我不太确定如何处理这个问题。我想也许是滑动窗口+Kadane的组合。我听说前缀和+滑动窗口可能是一个可能的解决方案,但我不确定如何实现它。