早上好,我有很多问题要解决:
您有一个大小为n的向量,您想找到一个大小为m的子向量,并且其元素之和为最小
如何工作的一个示例是: see example of operation 其中最小子向量为:{1,3,1},总和为5
我需要通过蛮力(下面将介绍滑动窗口)以及分而治之的技术来分析这个问题。然后,我将撰写一份比较报告,并解释说使用滑动窗口可以更好地工作。本文适用于某大学的算法比较项目。但是我需要使用D&C显式构建它。
我做了如下操作,但是在基本情况和返回最小和子向量时遇到问题。
// Function to find the minimum between two numbers
int min(int a,int b) { return (a < b)? a : b; }
// Function to find the minimum between three numbers
int min(int a,int b,int c) { return min(min(a,b),c); }
// Function to find the minimum sum that passes through the center of the vector
int minSumCenter(int v[],int l,int center,int h)
{
// Elements to the left of the center
int sum = 0;
int left_sum = INT_MAX;
for (int i = center; i >= l; i--)
{
sum = sum + v[i];
if (sum < left_sum)
left_sum = sum;
}
// Elements to the right of centre
sum = 0;
int right_sum = INT_MAX;
for (int i = center+1; i <= h; i++)
{
sum = sum + v[i];
if (sum < right_sum)
right_sum = sum;
}
// Return de los elementos que están tanto a la izquierda como a la derecha
return left_sum + right_sum;
}
// Minimum sum sub-vector size m,size v is h-l
int subvectorMinDyV(int v[],int h,int m){
// Base Case 1
if ((h-l) <= m) {
int sum = 0;
for(int i=0; i<m; i++)
sum += v[i];
return sum;
// Base Case 2
}else if(m*2-1 <= (h-l)){
int sum=0;
int sumMin = INT_MAX;
for(int i=0; i<(l+h)-m;i++){
sum=0;
for(int j=i; j<m; j++)
sum += v[j];
if(sum < sumMin)
sumMin = sum;
}
return sumMin;
}
int center = (l + h)/2;
/* Possible cases
a) minimum sum sub-vector is on the left
b) minimum sum sub-vector is on the right
c) minimum sum sub-vector is a in the middle */
return min(subvectorMinDyV(v,l,center,m),subvectorMinDyV(v,center+1,h,minSumCenter(v,h));
}
int main(){
int v[] = {6,10,4,2,14,1};
int n = sizeof(v)/sizeof(v[0]);
int sumMin = subvectorMinDyV(v,n-1,3);
cout << "The minimum amount with DyV is: " << sumMin << endl;
return 0;
}
非常感谢您。