第四章 最大子数组问题(股票最大收益) C++实现 算法导论
2015-04-27 16:05
806 查看
</pre><p></p><p>
最简单的方法就是暴力破解法,即尝试每一对可能买入卖出的日期组合,只要卖出日期在买入日期之后就行,这种运行时间n的平方量级。
最大子数组问题可以归为分治算法。只不过这个和平常的分治算法问题不同,这个问题的解分为三部分:最大值可能完全位于最左边,也可能完全位于最右边,也有可能跨越了中点。因此这个问题的关键点是求出位于中间的最大值 。然后返回max(leftsum,centrlsum,rightsum)。代码如下:</p><p>函数说明:Diffivec函数是为了求得相邻两天的差值,求值后,ivec[0]将不再使用,差值位于1到length-1;</p><p></p><p>运行中输入的数字为:连续的N天的股票价格,而结果就是一次买入,一次卖出的最大收益。 我完全按照书中的输入,得出的结果在最后图上所示。</p><p></p><p></p><pre name="code" class="cpp">#include <iostream> #include <vector> using namespace std; static const int Maxnum = 1024; //最大输入个数 int Maxcentrl(vector<int> &ivec,int left,int mid,int right) //求跨越中间点的最大值 { int maxleftsum,leftsum,maxrightsum,rightsum; maxleftsum = leftsum = maxrightsum = rightsum = 0; for(int i = mid;i >=left;--i) { leftsum += ivec[i]; if(leftsum > maxleftsum) maxleftsum = leftsum; } for(int i = mid + 1;i <= right;++i) { rightsum += ivec[i]; if(rightsum > maxrightsum) maxrightsum = rightsum; } return (maxleftsum + maxrightsum); } int max(int left,int centrl,int right) { if(left < centrl) { if(centrl < right) return right; else return centrl; }else if(left < right) return right; else return left; } int MaxSub(vector<int> &ivec,int left,int right) { int leftmax,rightmax,centrlmax; int mid; if(left == right)<span style="white-space:pre"> </span>//基准情况 { if(ivec[left] > 0)<span style="white-space:pre"> </span>//要考虑小于零的情况哦 return ivec[left]; else return 0; }else { mid = (left + right) / 2; } leftmax = MaxSub(ivec,left,mid);<span style="white-space:pre"> </span>//递归求左最大值 rightmax = MaxSub(ivec,mid + 1,right);<span style="white-space:pre"> </span>//递归求右最大值 centrlmax = Maxcentrl(ivec,left,mid,right);<span style="white-space:pre"> </span>//求跨越中间点的最大值<span style="white-space:pre"> </span> return max(leftmax,centrlmax,rightmax);<span style="white-space:pre"> </span>//返回三者中的最大值 } void Diffivec(vector<int> &ivec,int length) <span style="white-space:pre"> </span>//这个函数的目的是求得股票的差值 { for(int i = length - 1;i >= 0;--i) { ivec[i] = ivec[i] - ivec[i - 1]; } } int main(void) { vector<int> ivec; int elements; int length = 0; while(length < Maxnum && cin >> elements) { ivec.push_back(elements); ++length; } cout << "the original data is " << endl; for(int i = 0;i < length;i++) { cout << ivec[i] << ((i + 1) % length ? ' ':'\n'); } Diffivec(ivec,length); cout << "the Diff data is " << endl; for(int i = 1;i < length;i++) { cout << ivec[i] << ((i + 1) % length ? ' ':'\n'); } int maxsubsum; maxsubsum = MaxSub(ivec,1,length - 1); cout << " test max function " << max(0,1,2) << endl; cout << " the maxsub is " << maxsubsum << endl; return 0; }
如有问题,欢迎交流哦。
相关文章推荐
- 算法导论第四章-最大子数组问题
- <算法导论》第四章的求最大子数组的C语言实现
- 算法导论-最大子数组问题-线性时间复杂度算法分析与实现
- 《算法导论》中求最大子数组的C++实现
- 股票最大收益问题及数组最大差值问题
- 股票什么时候买进什么时候卖出收益最大----求最大子数组(算法导论第四章 4.1-3)
- 左神的书——《程序员代码面试指南》之生成窗口最大值数组问题c++实现
- 算法导论 4.1-5 最大子数组问题 线性时间算法 C++简单实现
- 最大子数组问题-c++代码实现及运行实例结果
- 最大子数组问题-c++代码实现及运行实例结果
- 最大子数组问题-c++代码实现及运行实例结果
- 最大子数组问题-c++代码实现及运行实例结果
- 最大子数组问题-c++代码实现及运行实例结果
- 最大子数组问题-c++代码实现及运行实例结果
- 最大子数组问题-c++代码实现及运行实例结果
- 最大子数组问题-c++代码实现及运行实例结果
- 最大子数组问题-c++代码实现及运行实例结果
- 最大子数组问题-c++代码实现及运行实例结果
- 最大子数组问题-c++代码实现及运行实例结果
- 最大子数组问题-暴力求解-c++代码实现及运行实例结果