求解最大子数组问题的三种方法
标签(空格分隔): 算法 分治 最大子数组
算法导论中有这样一个例子来引出最大子数组问题:
在股市中,人们为了获取更大利益,希望“低价买进,高价卖出”,从而获得最大收益。然而,简单的以最低价格买入,最高价格卖出并不能获得最大收益。我们可以不直接观察每日股票的价格,而是考虑每日股票的价格变化值。第 i 天的价格变化值定义为第
- 输入:数组 A={ 13,−3,−25,20,−3,−16,−23,18,20,−7,12,−5,−22,15,−4,7}
- 输出:最大子数组的和 43
暴力解法
- 算法思想
枚举数组中所有连续子序列的和,并求出其中的最大值。 代码
int max_sub_array_tolient(int a[],int n){ int this_sum; int max_sum = 0; for(int i=0;i<n;i++){ for(int j=i;j<n;j++){ this_sum = 0; for(int k = i;k<=j;k++){ this_sum += a[k]; if(this_sum>max_sum) max_sum = this_sum; } } } return max_sum; }
算法分析
很明显,上述代码嵌套三层循环,需要的时间复杂度为 O(n3) .
- 算法思想
分治解法
分治法(divide andconquer)是一种基于多分枝递归的算法范式。顾名思义,分治就是“分而治之”,即将原问题分解为两个或多个子问题,直到分解为不能分解的子问题,然后将这些问题合并成原问题的解。- 算法思想
假设我们要寻找 A[low...high] 的最大子数组。我们需要将子数组划分为两个规模大致相等的子数组。即我们将数组 A[low...high] 划分为 A[low...mid] 和
- 算法思想