最大连续子数组和的线性时间算法
Linear time algorithm for Maximum contiguous sub-array sum
我一直在解决 算法导论 - CLRS 的练习,并遇到了在线性时间内解决最大连续子数组 (Q 4.1-5)。
请在下面查看我的解决方案。我一直在为这个练习寻找在线评委,但找到了 none。在我寻找解决方案解决它之后,我发现 kadane 的算法似乎与我的实现不同,而且当所有数字都是负数时,这个解决方案给出了正确的输出。
public static int linearMaxSolve(int[] arr) {
int max = Integer.MIN_VALUE;
int sum = 0;
for (int i : arr) {
sum += i;
if (i > sum) {
sum = i;
}
if (sum > max) {
max = sum;
}
}
return max;
}
除了向程序提供手动测试用例之外,还有其他方法可以检查该算法的有效性吗?
这实际上取决于您对所有负值数组的定义。
如果您不将空 sub-array 算作可能的解决方案,那么是的,您的解决方案是正确的,实际上它与 Kadane's algorithm.
完全相同
int max_so_far = a[0];
int max_ending_here = a[0];
for (int i = 1; i < size; i++)
{
max_ending_here = Math.max(a[i], max_ending_here+a[i]);
max_so_far = Math.max(max_so_far, max_ending_here);
}
return max_so_far;
唯一的区别是初始化,但如果您仔细观察,在算法的第一次迭代中,sum
和 max
的值都将是 a[0]
.
但是,您再次假设您的数组不为空(在这种情况下您将 return Integer.MIN_VALUE
,是您想要的吗?)并且一个空的 sub-array (sum==0) 不是一个可能的解决方案。
我一直在解决 算法导论 - CLRS 的练习,并遇到了在线性时间内解决最大连续子数组 (Q 4.1-5)。 请在下面查看我的解决方案。我一直在为这个练习寻找在线评委,但找到了 none。在我寻找解决方案解决它之后,我发现 kadane 的算法似乎与我的实现不同,而且当所有数字都是负数时,这个解决方案给出了正确的输出。
public static int linearMaxSolve(int[] arr) {
int max = Integer.MIN_VALUE;
int sum = 0;
for (int i : arr) {
sum += i;
if (i > sum) {
sum = i;
}
if (sum > max) {
max = sum;
}
}
return max;
}
除了向程序提供手动测试用例之外,还有其他方法可以检查该算法的有效性吗?
这实际上取决于您对所有负值数组的定义。
如果您不将空 sub-array 算作可能的解决方案,那么是的,您的解决方案是正确的,实际上它与 Kadane's algorithm.
完全相同int max_so_far = a[0];
int max_ending_here = a[0];
for (int i = 1; i < size; i++)
{
max_ending_here = Math.max(a[i], max_ending_here+a[i]);
max_so_far = Math.max(max_so_far, max_ending_here);
}
return max_so_far;
唯一的区别是初始化,但如果您仔细观察,在算法的第一次迭代中,sum
和 max
的值都将是 a[0]
.
但是,您再次假设您的数组不为空(在这种情况下您将 return Integer.MIN_VALUE
,是您想要的吗?)并且一个空的 sub-array (sum==0) 不是一个可能的解决方案。