运行分而治之算法后从数组中打印最大子数组值
Posted
技术标签:
【中文标题】运行分而治之算法后从数组中打印最大子数组值【英文标题】:Print Max Subarray Values From An Array After Running Divide And Conquer Algorithm 【发布时间】:2016-01-13 09:25:02 【问题描述】:我已经实现了一个从值数组中找到最大子数组的解决方案。我可以在运行分治算法之前打印出完整的数组,但我似乎无法弄清楚在算法运行后如何打印子数组。
int newArray[] = 31, -41, 59, 26, -53, 58, 97, -93, -23, 84;
int arraySize = (sizeof(newArray)/sizeof(int));
printArray(newArray, 0, arraySize - 1);
int total = maxSubDiv(newArray, 0, arraySize - 1);
这是我的主要功能的 sn-p。在找到最大子数组之前,我正在使用 printArray 函数打印整个数组。 maxSubDiv函数如下:
int maxSubDiv(int * Array1, int left, int right)
if(left == right)
return Array1[1];
int middle = (left + right)/2;
return findMax(maxSubDiv(Array1, left, middle), maxSubDiv(Array1, middle + 1, right), leftRightCross(Array1, left, middle, right));
int leftRightCross(int * Array1, int left, int middle, int right)
int sum = 0;
int leftSum = INT_MIN;
for(int i = middle; i >= left; i--)
sum = sum + Array1[i];
if(sum > leftSum)
leftSum = sum;
sum = 0;
int rightSum = INT_MIN;
for(int i = middle + 1; i <= right; i++)
sum = sum + Array1[i];
if(sum > rightSum)
rightSum = sum;
sum = leftSum + rightSum;
return sum;
该算法似乎测试得很好,但我只是无法打印出包含最大子数组整数的子数组。非常感谢任何帮助!
struct tuple
int begin;
int end;
int length;
;
int findMax(int left, int right, int cross)
int max;
if(left > right && left > cross)
max = left;
else if(right > left && right > cross)
max = right;
else
max = cross;
return(left, right, cross);
【问题讨论】:
【参考方案1】:在maxSubDiv()
中,当您比较三个子数组的最大值时,返回最大子数组的元组(开始、结束、长度)而不仅仅是长度。 "begin"
、"end"
指定最大子数组的范围,您可以稍后利用它进行打印。您还应该从leftRightCross()
返回(开始、结束、长度)。
例如,
// pesudocode
if max is left:
return (left_begin, left_end, left_length)
if max is right:
return (right_begin, right_end, right_length)
if max is middle:
return (middle_begin, middle_end, middle_length)
元组可以在 C 中的struct
中实现。
【讨论】:
我理解这个概念,但我只是不知道如何实现它。我在上面发布了更多代码。以上是关于运行分而治之算法后从数组中打印最大子数组值的主要内容,如果未能解决你的问题,请参考以下文章