我正在尝试使用分而治之的方法来实现以下算法,以便将运行时间变为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)复杂性。
如果有关于如何继续这一点的任何指示或提示,我们将不胜感激。另外,我目前正在假设阵列中存在偶数个整数。谢谢你们。
答案 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);
}