算法_分治法求最大子数组

原创 2016年10月01日 11:51:31


1.分治策略思想在于复杂的问题分解为简单的子问题进行求解

2.最大子数组问题为从给出的数值型数组中提取出一个连续的总值最大的子数组。

3.将一些问题抽象为最大子数组问题并加以解决在现实中是非常实用的

  比如,我们想从一段时间的股票价格变化曲线图中计算出其买进股票和卖出股票的最佳时机时可转换为最大子数组问题。首先我们将曲线图数据提取为一个数组,数组的每个元素值为对应日期相对于前一天的股票差值。求出最大的子数组即为回报值(正盈负亏)。


*最大子数组问题的求解方法只有在数列中同时存在正数和负数的时候才有意义。

#include<iostream>
using namespace std;
#define N 8
int max_subarray(int count,int * arr)
{
	
	if (count == 1)
		return arr[0]<0?0:arr[0];
	else
	{
		//递归求出左边最大值
		int left_bigestsum= max_subarray(count / 2, arr);
		//递归求出右边最大值
		int right_bigestsum= max_subarray(count - count / 2, &(arr[count/2]));
	
		//以中间为轴求出两边最大值并相加,等于过中间元素的最大数组值
		int mlsum = 0,mrsum=0, sum = 0;
		for (int i = count / 2; i>=0; i--)
		{
			sum += arr[i];
			if (sum >= mlsum)
				mlsum = sum;
		}
		sum = 0;
		for (int i = 1+count/2; i <count; i++)
		{
			sum += arr[i];
			if (sum >= mrsum)
				mrsum = sum;
		}

		//比较三种情况中的最大值,并返回
		return (mlsum + mrsum) > (left_bigestsum > right_bigestsum ? left_bigestsum : right_bigestsum) ? mlsum + mrsum : (left_bigestsum > right_bigestsum ? left_bigestsum : right_bigestsum);
	}
}

int main()
{
	int data[N];
	for (int i = 0; i < N; i++)
	cin >> data[i];

	cout << max_subarray(N,data);
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

算法导论——分治法——最大子数组问题

好久没有写博客了。以后我会不定期地写一些算法的博客,分享一些算法的感想。以下的说法很多都是我自己的感想,肯定有很多不足的地方,希望大家指正。 今天把算法导论里面分治法这一章里面的第一个问题——最大子数...
  • songxueyu
  • songxueyu
  • 2015年07月19日 20:37
  • 877

分治法解决最大子数组问题

利用分治法解决最大子数组问题(对给定的数组得到该数组中具有最大和的子数组)/* * 对于给定的整数数组A,求出数组中具有最大和的子数组,最大和以及左右下标 * 思路:采用分治的方法,将数组分为两部...
  • wenjiashun
  • wenjiashun
  • 2015年04月16日 00:06
  • 931

分治算法-最大子数组问题

背景不做过多介绍,现在有这么一个数组,里面都是整数型(包含负数),求最大子数组(连续几个相加最大)。例子如下: 首先我们分析问题,我们把此数组看作A[low..high],我们将要用分治法求出其最大...
  • qq_23660243
  • qq_23660243
  • 2016年03月05日 16:11
  • 1799

分治法——最大子数组

题目描述: 给定一个n个元素的数组a,求a[i]+a[i+1]+…+a[j]的最大值(0
  • fuyukai
  • fuyukai
  • 2015年03月10日 20:38
  • 925

最大子数组问题分治法(递归)Java实现

FindMaximumSubArray.java public class FindMaximumSubArray{         private int low ;         pr...
  • pjblogs
  • pjblogs
  • 2014年10月01日 21:32
  • 444

分治法求最大子数组问题

1.思想:将数组分治为三部分来进行求解:以中间为划分,最大字数组可能在左半部分,也可能在右半部分,也可能跨越中间。 2.参考算法导论,实现用java代码: public class Fenzh...
  • HGodsun
  • HGodsun
  • 2016年09月11日 20:14
  • 490

分治法求最大子数组备忘

#include #include #include using namespace std; #define maxn 100000+1 #define min -2147483647 int ma...
  • u011437680
  • u011437680
  • 2015年06月09日 17:30
  • 297

计算最大值和最小值(分治法)

分治法计算最大值和最小值,是一个经典的算法程序。 原始数据使用随机函数生成。 采用结构化程序设计,可以很容易改为从标准输入或文件读入数据,只需要修改函数getData即可。 数据个数由宏定义给出,也...
  • tigerisland45
  • tigerisland45
  • 2016年04月21日 12:17
  • 1580

分治法求最大子数组

#include //1.假设最大子数组跨越中点,得到跨越中点的最大子数组。 int Find_Max_Crossing_SubArray(int A[], int low, int mid, in...
  • group401
  • group401
  • 2016年04月20日 20:20
  • 72

「算法导论」:分治法求最大子数组

时间复杂度:o(nlgn)
  • u014723123
  • u014723123
  • 2014年07月07日 16:54
  • 409
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法_分治法求最大子数组
举报原因:
原因补充:

(最多只允许输入30个字)