使用分而治之的方法实现简单的算法

时间:2012-05-21 03:38:24

标签: algorithm divide-and-conquer

我正在尝试使用分而治之的方法来实现以下算法,以便将运行时间变为O(n * logn)。

  

给定一系列数字a_1,a_2,...,a_n和数字k,找到i和j使得1 <= j-i <= k,同时最大化a_i + a_j。

     

例如,对于序列10,2,0,8,1,7,1,0,11和k = 2,最大值为15 = 8 + 7.

我已经实施了某种分而治之的方法,但我正在努力弄清楚如何检查每个除法间隔的值。以下是我到目前为止的情况:

int MaxInterval(int array[], int left, int right, int k)
{
    int BestSum = 0;
    int sumL = 0;
    int sum = 0;
    int sumR = 0;
    int sumMid = 0;
    int count = 0;
    if( right - left <= 2*k-3 ) //
    {
      //elaborate straightforward search right way
      for(int i = left; i <= right; i++)
      {
          sum = 0;
          count = k;
          for(int j = i+1; j <= right; j++ )
          {
              if(count == 0) break;
              sum = array[i] + array [j];
              if(sum > BestSum) BestSum = sum;
              count--;
          }

      }
      return BestSum;
    }
    int mid = (right + left)/2;
    sumL = MaxInterval(array, left, mid, k);
    sumR = MaxInterval(array, mid + 1, right, k);
    sumMid = MaxInterval(array, max(left, mid - k + 2), min(right, mid + k - 1), k);
    return max(max(sumL, sumR), sumMid);
}

我认为我正处于正确的轨道上,我正在努力弄清楚如何结合两个间隔的数字校验和,而不使用会产生O的蛮力方法(n ^ 2)复杂性。

如果有关于如何继续这一点的任何指示或提示,我们将不胜感激。另外,我目前正在假设阵列中存在偶数个整数。谢谢你们。

1 个答案:

答案 0 :(得分:1)

伪代码的一些线索。 n = 8,k = 2的示例 - 此代码将从[0..3],[4..7]和[2..5]中搜索最佳结果。请注意,我已删除了其他数组。

int MaxInterval(int array[], int left, int right, int k)
{
    if( right - left <= 2*k-1 ) //
    {
      //elaborate straightforward search right way
      return BestSum;
    }
    sumL = MaxInterval(array, left, mid, k);
    sumR = MaxInterval(array, mid + 1, right, k);
    sumMid = MaxInterval(array, max(left, mid - k + 1), min(right, mid + k), k);
    return max(sumL, sumR, sumMid);
}