我正在阅读Jon Bentley的“Programming Pearls”,其中有一个我似乎无法回答的问题。这是:
在最大子阵列问题中,我们得到一个nxn实数数组,我们必须找到任何矩形子数组中包含的最大总和。
在本章中,它列出了一种查找数组最大值的算法:
maxsofar = 0
maxendinghere = 0
对于i = [0,n)// n)= n-1
/ * ivariant:maxendinghere和maxsofar对于x [0 ... i-1] * /
是准确的
maxendinghere = mac(maxendinghere + x [i],0)
maxsofar = mac(maxsofar,maxendinghere)
我正在考虑你是否可以按照一句话说些什么
对于所有列
对于所有行
上面显示的算法
但我不确定这会奏效。任何想法?
答案 0 :(得分:2)
首先,你必须了解1d阵列版本:1d阵列的最大连续总和。
解决1d数组版本,算法很简单,你已经给出了上述。
maxsofar = 0
maxendinghere = 0
for i = [0, n)
maxendinghere = max(maxendinghere + x[i], 0)
maxsofar = max(maxsofar, maxendinghere)
这是O(n)。然后我们可以花费到2d版本。对于2d版本,你可以将它转换为1d版本并仍然使用上述算法,但如何?只需将一列中的值相加,并将总和视为新的1d数组。例如:
矩阵是2 * 2如下:
1 2
3 4
总结之后,你可以得到
4 6
得到了吗?你需要做的就是枚举所有可能的方法来计算从第i行到第j行的列总和。然后应用上面的密钥算法。伪代码:
for i=0 to n
for j=i to n
create a new array which contains the column sum from the ith row to jth row
apply the above O(n) algorithm to get the maximum
总复杂度为O(n ^ 3)