这种用于查找连续子数组中最大和的递归算法有什么优势吗?
Does this recursive algorithm for finding the largest sum in a continuous sub array have any advantages?
目的:评估在下面的连续子数组中查找最大和的算法。
注:用C++写
当我研究Kadane使用动态编程成功解决的问题时,我想我会找到自己的解决方法。我通过使用一系列递归调用来实现这一点,具体取决于通过缩短数组的末端来增加总和是否可以更大。见下文。
int corbins_largest_sum_continuous_subarray(int n, int* array){
int sum = 0; // calculate the sum of the current array given
for(int i=0; i<n; i++){sum += array[i];}
if(sum-array[0]>sum && sum-array[n-1]>sum){
return corbins_largest_sum_continuous_subarray(n-2, array+1);
}else if(sum-array[0]<sum && sum-array[n-1]>sum){
return corbins_largest_sum_continuous_subarray(n-1, array);
}else if(sum-array[0]>sum && sum-array[n-1]<sum){
return corbins_largest_sum_continuous_subarray(n-1, array+1);
}else{
return sum; // this is the largest subarray sum, can not increase any further
}
}
我知道Kadane的算法需要O(n(时间。我在计算算法的大 O 时遇到问题。也会是O(n(吗?因为它使用 O(n( 计算总和,之后的所有调用都使用相同的时间。我的算法比Kadane的算法有什么优势吗?卡达内的算法在哪些方面更好?
首先,表达式sum-array[0]>sum
等价于array[0]<0
。类似的观察也适用于代码中的其他条件。
您的算法不正确。您在此处的评论不正确:
}else{
return sum // this is the largest subarray sum, can not increase any further
}
当你到达这一点时,你知道外部的两个值都是正的,但数组中的其他地方可能有一个负和子数组,当删除时,它将给出两个剩余的子数组,其中一个(或两个(的总和可能大于总和。
例如,以下输入就是这种情况:
[1, -4, 1]
您的算法将得出结论,最大总和是通过取完整数组(总和为 -2(实现的,但子数组 [1] 表示更大的总和。
其他反例:
[1, 2, -2, 1]
[1, -3, -3, 1, 1]
相关文章:
- 返回递归调用和仅递归调用的区别
- 需要为 C++ 中的以下问题设计递归算法
- 这种用于查找连续子数组中最大和的递归算法有什么优势吗?
- 使用递归反转和打印出数组的内容
- 如何改进搜索二项式系数的递归算法
- 如何转换多次调用自己的递归算法?
- 如何将字符串保存在最长的常见子序列递归算法中
- 为什么这种递归子集和算法会导致指针分配错误
- 带有递归继承和使用声明的Variadic模板
- 可传递值影响递归算法的渐近时间复杂性
- Python到C++:使用递归列出背包的所有组合的算法
- 我的递归算法中的问题,用于查找所有最短、唯一的路径
- "find"的递归版本和非递归版本有什么区别?
- 静态和非静态递归成员之间的差异
- 带有两个递归调用的递归算法的时间复杂性
- 具有可变模板的递归继承和继承参数问题
- 递归算法中的分段错误
- O(n^m) 复杂度的递归算法
- 了解递归函数中的数组和指针
- 在递归下降语法分析器中避免了递归算法中的stackoverflow