最大子数组问题

分而治之:最大子数组问题 分而治之(一):最大子数组问题 问题: 给出一个数组,找到一个子数组(连续的),使得该子数组的元素和是最大的。 输入: 给定一个数组X[1…n],对于任意一对数组下标为l,r(l≤r)的非空子数组,其和记为S(l,s). 输出: 求出S(l,s)的最最值,记为Smax . 问题分析 将数组X[1…n]分为X[1…n/2]和X[n/2 +1…n] 递归求解子问题 S1∶数组X[1…n/2]的最大子数组 S2∶数组X[n/2+1…n]的最大子数组 合并子问题,得到Smax S3∶跨中点的最大子数组 数组X的 阅读详情

问题基于《算法导论》第四章 分治策略中最大收益问题


问题原型:

假如你能获取股票未来的行情,怎么计算出什么时候买入,什么时候卖出才能获得最大收益。


首先分析数据后认为在最低处购买向后找到最高点,或者在最高处卖出向前找到价格最低的点。对比这两个点大小。

书中给出了反例,证明该方法并不能准确找出最大收益方案,反例如下:

天数01234
价格10117106
变化 1-43-4
该例子中并不能以之前两种猜想获取最大收益


暴力求解方案

遍历所有买入,卖出可能性进行比较。这种方案当然可行但是其运行时间为Ω(n^2),C++代码如下:

int x[10] = { 0, 2, -4, -1, 3, 2, -5, 8, -1, 3 };

void normal()
{
	int start = 0;
	int end = 0;
	float shouyi = 0.0f;
	float temp = 0.0f;
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			if (i < j)
			{
				for (int m = 0; m < j - i+1; m++)temp += x[m + i];
				if (temp > shouyi)
				{
					shouyi = temp;
					start = i;
					end = j;
				}
				temp = 0;
			}
		}
	}
	cout << "start:" << start << endl << "end:" << end << endl << "shouyi:" << shouyi << endl;
}


可以输出结果

start=7

end=9

shouyi=10

这种方案当然不是最优解。


最大子数组方案

不再考虑输入数组,而是关心价格变化,此时,只需要找到一个起始为i终止为j的子数组,其和最大即可。
但如果任然用简单的循环方式也并不能简化运算,此时可以将数组拆分为两段。
原数组x
02-4-132-58-13

子数组1
02-4-13
start---mid
子数组2
2-58-13
mid--end

此时有三种可能:
1.最大子数组在子数组1范围内:start<=i<j<=mid
2.最大子数组在子数组2范围内:mid<=i<j<=end
3.最大子数组需要穿过子数组1,2:start<=i<=mid<=j<=end

在例子中 第一种情况需要循环25次
void findleft(int x[],int mid,int length)//在左边子数组
{
	int start = 0;
	int end = 0;
	int temp = 0;
	int shouyi = 0;

	for (int i = 0; i < mid; i++)
	{
		for (int j = 0; j < mid; j++)
		{
			if (i < j)
			{ 
				for (int m = 0; m < j - i+1; m++)temp += x[i + m];
				if (temp > shouyi)
				{
					shouyi = temp;
					start = i;
					end = j;
				}
				temp = 0;
			}
		}
	}
	cout << "left" << endl;
	cout << "start:" << start << endl << "end:" << end << endl << "shouyi:" << shouyi << endl;
}
寻找右半段子数组也需要25次:
void findright(int x[],int mid,int length)//在右边子数组
{
	int start = 0;//起始数组下标
	int end = 0;//终止数组下标
	int temp = 0;//临时存储收益值
	int shouyi = 0;//最大收益值

	for (int i = mid; i < length; i++)
	{
		for (int j = mid; j < length; j++)
		{
			if (i < j)
			{
				for (int m = 0; m < j - i+1; m++)temp += x[i + m];
				if (temp > shouyi)
				{
					shouyi = temp;
					start = i;
					end = j;
				}
				temp = 0;
			}
		}
	}
	cout << "right" << endl;
	cout << "start:" << start << endl << "end:" << end << endl << "shouyi:" << shouyi << endl;
}

对于第三种情况因为多了必须穿过中间点的限制,所以也需要25次循环
void findcross(int x[],int mid,int length)//越过中心点
{
	int start = 0;//起始数组下标
	int end = 0;//终止数组下标
	int temp=0;//临时存储收益值
	int shouyi = 0;//最大收益值

	for (int i = 0; i < mid; i++)
	{
		for (int j = mid; j < length; j++)
		{
			for (int m = 0; m < j - i+1; m++)
				temp += x[i + m];
			if (temp > shouyi)
			{
				shouyi = temp;
				start = i;
				end = j;
			}
			temp = 0;
		}
	}
	cout << "cross" << endl;
	cout << "start:" << start << endl << "end:" << end << endl << "shouyi:" << shouyi << endl;
}



总循环数为75(3/4*n^2),而暴力破解需要100(n^2)


算法复习——动态规划篇之最大子数组问题 算法复习——动态规划篇之最大子数组问题 以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习! 1. 问题背景 子数组:数组中连续的一段序列,例如X[3..7]X[3..7]X[3..7]; 子数组和:子数组中元素的求和,X[3..7]X[3..7]X[3..7]的和就是3+5−4+3+2=93+5-4+3+2=93+5−4+3+2=9; ​ 那么,问题就是如何寻找数组XXX中最大的非空子数组? 2. 问题定义 最大子数组问题(Max Continuous Subarr 阅读详情

相关推荐

算法之最大子数组问题

最大子数组问题就是在一个数组中寻找出它的最大的非空连续子数组。本次我将采用3种方式来解决此问题。 方法一:暴力求解方法 暴力方法就是简单的找出出每种可能组合出的组合,找出其中的最大的就可以了 伪代码: FIND-MAX-SUBARRAY(A, low, high) left = 0 right = 0 sum = -∞ for i = low to high c

Phenixfate的专栏 859

《算法导论》-分治策略-最大子数组问题,理解与实现(Java,C++)

关于最大子数组问题如果采用暴力破解法将会很容易实现,但是暴力破解复杂度可想而知,所有如果采用分治策略可以大大减少运行时间,下面将分析分治策略如何解决这个问题,通过伪代码来表示执行过程,并用Java,C++进行实现.

qq_44242804的博客 794

从零开始利用MATLAB进行FPGA设计(六)用ADC采集信号教程1

用AN9238采集信号的方法(1),包含PLL、FIFO、ILA的基础教程。

WZT725的博客 3094

最大子数组问题之Python和C++实现

最大子数组问题 1.背景 《算法导论》中是通过股票的购买与出售,经过问题转换,将前一天的当天的股票差价重新表示出来,即转为了一个最大子数组的问题,相当于就是寻找一个数组的和最大的非空连续子数组 如 13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7 找到这连续的16个数里面的连续和最大的子数组,具体详情可以网上...

qq_32531519的博客 444

Edge浏览器IE模式失效?最新142版本隐藏按钮的3种解决方案

本文针对Edge浏览器142版本中IE模式按钮消失的问题,提供了3种实用解决方案,包括注册表修改、手动添加网站到IE模式列表和企业策略部署方案,帮助用户解决兼容性问题,确保老旧系统正常访问。

weixin_28308325的博客 497

TIA博途中S7-1200进行MODBUS TCP通信(作为服务器)的具体方法演示

TIA博途中S7-1200进行MODBUS TCP通信(作为服务器)的具体方法演示

Robot_PLC_HMI_Automation 8607

C++ 使用分治法求最大子数组

C++使用分治法求最大子数组

weixin_47668926的博客 1008

《QGIS快速入门与应用基础》191:渐变区间设置(等间隔/分位数)

深入解析QGIS中渐变符号化的核心环节——渐变区间设置,重点对比等间隔与分位数两种主流模式的原理与应用。作者指出,90%的渐变效果问题源于区间设置不当,强调必须先分析数据分布特征(通过统计面板查看直方图、极值等)再选择匹配模式。等间隔模式适用于均匀分布数据(如海拔、温度),将数值范围均等划分;分位数模式则针对偏态数据(如GDP、人口),保证每个区间要素数量相等。文章通过界面示意图、效果对比图和操作步骤详解,指导读者根据数据类型选择合适区间模式,并提醒常见避坑要点:社会经济数据禁用等间隔、分类数不超过8类。

LuckyHanMo的博客 315

C++实现——最大子数组问题

在给定数组下求解其中相加最大的子数组。

qq_39542725的博客 603

【YOLO多模态检测顶刊】TGRS 2025范文解读,RGFNet 可见光-红外图像融合目标检测,2026年基于YOLO多模态融合属于发文热点,小论文和大论文通用,通读顶刊了解做实验和论文写作的全流程

🔥本文提出了一种反射率引导的渐进特征对齐网络(RGFNet)用于全天候无人机目标检测。该方法利用Retinex理论从可见光图像中提取光照不变的反射率特征,设计了反射率引导协同对齐模块(RCAM)实现跨模态双向特征对齐,并通过光照感知选择性融合模块(LSFM)在共享状态空间中进行高效特征交互。在DroneVehicle和DVTOD数据集上的实验表明,RGFNet分别达到81.4%和88.5%的mAP,显著优于现有方法。该方法有效解决了低光照条件下可见光-红外图像特征错位问题,为全天候无人机检测提供了新思路。

Ai缝合怪、助力小伙伴高效发论文 1077

1、网站可靠性工程(SRE):原理、实践与转型指南

本文深入探讨了网站可靠性工程(SRE)的核心原理、实践方法以及组织转型策略。从SRE的基本概念如服务水平指标(SLI)、服务水平目标(SLO)和错误预算入手,详细解析了如何通过SRE实现产品开发、运营和管理团队的高效协作。此外,还涵盖了SRE的实施步骤,包括现状评估、组织认同、基础设施建设、事件响应、错误预算政策制定以及组织结构设计等内容。最后,文章展望了SRE的未来发展,强调了服务目录、合规监管及SRE文化建设的重要性,为企业的现代化运营体系转型提供了全面指南。

xk7n92h3p5m的博客 145

算法----最大子数组和

这是一道很经典的算法题目,考的烂的不能再烂,还是有很多公司拿它来作为笔试题目,题目不难,这里我给出三种方法。 问题描述:一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该子数组中各元素的和最大,这个子数组便被称作最大子数组。比如数组{2,4,-7,5,2,-1,2,-4,3}的最大子数组为{5,2,-1,2},最大子数组的和为5+2-1+2=8。 方法一:暴力求解方法 利用两

chen 5850

改进后的yolov8导出进行部署到rk3588上时,导出为onnx格式报错aten::fft_fft2算子不支持导出...如何解决?

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 备注:部分问题/疑难杂症搜集于互联网。

**My Coding Family** 1796

最大子数组问题(分治法)

问题描述:对给定数组A,寻找A的和最大的非空连续子数组。 输入格式:输入的第一行包括一个整数n,代表数组中的元素个数,接下来的一行包含n个整数(可以包含负数),以空格分隔。 输出格式:一个整数,表示最大的连续子数组的和。 样例输入: 9 2 4 -7 5 2 -1 2 -4 3 样例输出: 8 解题思路:使用分治法 分:将数组分成两半,直到只有一个元素 治...

weixin_41423494的博客 7870

低光照图像增强:从传统方法到深度学习

低光照图像增强:从传统方法到深度学习​ 人工智能,计算机视觉,大模型,AI,本文聚焦视觉模型的偏差与公平性问题,阐述了偏差在性别、种族、年龄等方面的表现及对医疗、司法、安防等领域的影响。分析了偏差源于数据采集与标注问题及算法局限。介绍了准确率差异等公平性评估指标、相关数据集和工具,还给出数据处理、算法改进、模型训练等避免歧视的策略,并附代码示例与实际案例,为提升视觉模型公平性提供多方面参考。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 2万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

算法复习——分而治之篇之最大子数组问题

算法复习——分而治之篇之最大子数组问题 以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习! 1. 问题背景 子数组:数组中连续的一段序列,例如X[3..7]X[3..7]X[3..7]; 子数组和:子数组中元素的求和,X[3..7]X[3..7]X[3..7]的和就是3+5−4+3+2=93+5-4+3+2=93+5−4+3+2=9; ​ 那么,问题就是如何寻找数组XXX中最大的非空子数组? 2. 问题定义 最大子数组问题(Max Continuous Subarr

NickHan_cs的博客 1069

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

什么是最大子数组问题?

最大子数组(Max Subarray)问题,是计算机科学与技术领域中一种常见的算法问题,主要可以利用分治思想进行快速实现。最大子数组问题描述如下:假如我们有一个数组,数组中的元素有正数和负数,如何在数组中找到一段连续的子数组,使得子数组各个元素之和最大。最大子数组问题在生活中有很多实际情况可以与其对应,比如说我们观察某一股票在一段时间内的走势,请问如何找出在哪一天买入,哪一天卖出可以赚到最大差价(这里假设你已经知道股票的价格走势)

mukewangguanfang的博客 1557

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

最大子数组和问题

算法导论在分治策略一章中提到了最大子数组和问题,我用c++实现了一下,还是挺简单的,只不过要return最大子数组的起始下标、结束下标和最大子数组和这三个数有点麻烦,如要使用引用的话,因为要递归传值所以不好实现,一个可行的办法是使用数组,将这三个值放在数组中传递。lz这里并没有写这一过程。 分治算法找最大子数组和将情况分成三种: 1.最大和数组在中间元素左侧; 2.最大和子数组在中...

256
上一篇: 基于C语言单链表的成绩管理程序
下一篇: 数据结构之栈
shu_8708
博客等级 码龄10年 45粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值