最大子序列和|算法分析

求最大子序列和问题(读《数据结构与算法分析——C语言描述》有感) 根据《数据结构与算法分析——C语言描述》中的“最大子序列和”问题来看如何分析算法。 阅读详情
题目要求:给定一个数序列,计算出其子序列和的最大值

输入样例:4 -3 5 -2 -1 2 6 -2
输出样例:11

一、穷举法
我们最容易想到的是穷举法,就是将所有可能的情况列举出来然后比较得到最大的那个,如下:
int MaxSubsequenceSum(int a[] , int n)
{
	int thisSum, maxSum, i, j, k;
	maxSum = 0;
	for(i=0; i < n; i++)
	{
		for(j=i; j < n; j++)
		{
			thisSum = 0;
			for(k=i; k <= j; k++)
				thisSum += a[k];
			if(thisSum > maxSum)
				maxSum = thisSum;
		}
	}
	return maxSum;
}

这个是最容易想的一种算法,但是其时间复杂度是O(n^3),主要在于我们在穷举的时候,在那些不是最大子序列和的项上浪费的时间太多了,所以就导致了时间复杂度达到了(n^3)的级别,那么我们接下来就要想方法把那些项去掉

二、升级版穷举法
观察上面代码,我们发现最内层循环求和我们可以在列举时顺带求解,就不用每次求从 j 到 i 的各项和了,而是从 i 开始,逐次加上后一项,一直到数组的最后一项,如果在过程中加了一项之后和是最大的我们就保存下来,这样同样可以达到上面算法的目的
int MaxSubsequenceSum(int a[] , int n)
{
	int thisSum, maxSum, i, j;
	maxSum = 0;
	for(i=0; i < n; i++)
	{
		thisSum = 0;
		for(j=i; j < n; j++)
		{
			thisSum += a[j];
			if(thisSum > maxSum)
				maxSum = thisSum;
		}
	}
	return maxSum;
}

该算法时间复杂度是O(n^2),它将上一个算法每一步都从头开始算改成了从当前位置往后算,由此将时间复杂度降了一阶,然而当数组变得庞大,(n^2)的复杂度依旧很可怕,我们继续寻找更加快速的算法

三、分治算法
分治算法在求解大规模的问题时经常是很好用的一种算法,其想法是把问题分成若干个规模更小的同类问题,然后递归地求解,最后将求得的结果合在一起即可得到整个问题的解,在这里同样我们可以将这个数组分成左右两个规模更小的数组
int maxSubSum(int a[], int left, int right)
{
	int maxLeftSum, maxRightSum;
	int maxLeftBorderSum, maxRightBorderSum;
	int leftBorderSum, rightBorderSum;
	int center, i;
	if(left == right)				//中间位置
		if(a[left] > 0)
			return a[left];
		else 
			return 0;

	center = (left + right) / 2;
	maxLeftSum = maxSubSum(a, left, center);         //递归分治
	maxRightSum = maxSubSum(a, center+1, right);	 //递归分治
	
	maxLeftBorderSum = 0;
	leftBorderSum = 0;
	for(i = center; i >= left; i--)
	{
		leftBorderSum += a[i];
		if(leftBorderSum > maxLeftBorderSum)
		 	maxLeftBorderSum = leftBorderSum;
	}

	maxRightBorderSum = 0;
	rightBorderSum = 0;
	for(i = center+1; i <= right; i--)
	{
		rightBorderSum += a[i];
		if(rightBorderSum > maxRightBorderSum)
		 	maxRightBorderSum = rightBorderSum;
	}
	return max3(maxLeftSum , maxRightSum, maxLeftSum + maxRightSum);
}

int maxSubsequenceSum(int a[],int n)
{
	return maxSubSum(a, 0, n-1);
}

这个算法虽然看起来复杂,但其时间复杂度却是O(n · log n)的,主要是因为它不再是盲目的穷举,而是有目的性地划分求解,最后得到所有解当中的最大值,max3函数是返回最大值,在这里没有实现该函数。

四、巧妙算法
对于不同的题目偶尔可以找到只适用于该题目的特殊且巧妙的算法,有一点投机取巧的意思,对于这道题,由于求的是最大子序列和,所以我们可以在求解过程中只保留一个最大的,然后用“打擂法”将当前算出来的最大的那个保留到最后
int MaxSubsequenceSum(int a[] , int n)
{
	int thisSum, maxSum, i;
	thisSum = 0;
	maxSum = 0;
	for(i=0; i < n; i++)
	{
		thisSum += a[i];
		if(thisSum > maxSum)
			maxSum = thisSum;
		else if(thisSum < 0)         
		/*巧妙所在:当加上当前值后和小于0时,说明后面的项加上前面这一段都会使和小于
		从后面的项开始求得的和,所以就直接舍弃前面的项*/
			thisSum = 0;    
	}
	return maxSum;
}

该算法时间复杂度是O(n),是这四种算法中最佳的算法

算法分析——最大连续子序列和的问题 ·最大连续子序列求和问题 问题引出: 给定整数A1,A2,A3 ··· AN (可能有负数),求解的最大值。如果所有的整数全是负数,则最大连续子序列的和为零。 举个例子,如果输入{-2,11,-4,13,-5,2},那么答案是20,它代表的连续序列是从第2项至第4项。再举一个例子,输入为{1,-3,4,-2,-1,6},那么答案是7,这个子序列包括最后4项。 ·简单的O(N3)算法 阅读详情

相关推荐

【数据结构和算法分析】最大子序列求和问题及联机算法

最大子序列求和问题

HY's blooooog 2113

寻找最大子序列并输出

对于一个给定的序列,输出其最大的子序列,如 {1,3,8,2,}

d704274243的专栏 658

Windows域账户无管理员权限也能装软件?3步搞定UAC设置(附安全提醒)

本文探讨了在Windows域环境中,如何通过配置用户账户控制(UAC)实现临时提权,让无管理员权限的域账户也能安装软件。文章详细介绍了三步走策略:临时加入本地管理员组、调整UAC行为以及至关重要的权限回收,并提供了脚本化部署方案与安全实践指南,旨在平衡企业IT管理的效率与安全。

fox11的博客 760

C语言最大子序列和三种常用解决方法

注:看不懂评论区提问,有问必答。 问题:给定K个整数组成的序列{ N​1​​, N​2​​, ..., N​K​​ },“连续子列”被定义为{ N​i​​, N​i+1​​, ..., N​j​​ },其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2,1,-3,4,-1,2,1,-5,4},其连续子列{ 4,-1,2,1}有最大的和6。 输入:数组个数k,整数数组a[MAXN],整数之间空格隔开。 输出:最大子序和maxsum。 一、双重循环.

weixin_45734473的博客 3410

yersinia -G打不开图形化界面解决方案(曲线救国,实操可行)

附Kali 2021 VMware懒人版,已完成汉化,更新源,并已经安装yersinia。ping 114.114.114.114也不通,接着ifconfig发现 IP地址有的,然后手动配置了IP地址,发现还是Ping不通114.11.4.114.114,然后输入。更新源后,报错源无法解析,同时ping www.baidu.com也不通,那可能是DNS存在问题,更新一下DNS服务器。百度找了很久,有个回答比较接近,但一一尝试了几遍,还是无解,解决不了呀!•(2)Yersinia编译的时候,要选择gtk。

weilandeyongheng的专栏 4170

保姆级教程:手把手教你给联想System x 3650 M5服务器配置RAID 5并U盘装系统

本文提供联想System x 3650 M5服务器配置RAID 5并U盘安装系统的详细教程,特别适合零基础运维人员。从准备工作、RAID 5配置到U盘引导和系统安装,涵盖全流程关键步骤与常见问题解决方案,帮助用户高效完成服务器部署。

weixin_42535703的博客 358

算法——输出数组最大子序列和

今天看算法,看到一道题,题目描述如下: 给一个数组,找出该数组的最大子序列和。例如:数组{0,-1,-9,8,1,-8,10,-1},最大子序列为8+1-8+10=11,需要输出11。 由于很久没有写算法,遇见这个问题想了很久,大约花了一个半小时才想出来这个问题。 先贴一下代码: package com.atguigu.java; public class HelloWorld { ...

Searchin_R的博客 1265

Cursor集成Claude 4.6免费版:本地IDE合规调用指南

大语言模型编程助手(LLM Copilot)已成为现代开发标配,其核心能力依赖于上下文理解、代码推理与结构化输出等关键技术原理。Anthropic官方提供的Claude系列模型,尤其Claude 4.6,凭借200K超长上下文、tool use函数调用和严格可控的API设计,在工程实践中展现出显著技术价值。该能力可无缝嵌入本地IDE环境,支撑代码解释、跨文件分析、单元测试生成等高频开发场景。本文聚焦Cursor这一开源可审计IDE,详解如何合规复用Anthropic免费tier接口(/v1/messages

weixin_34095889的博客 538

最大子序列和问题

最大子序列和问题 问题描述: 输入一组整数,求出这组数字子序列和中最大值。也就是只要求出最大子序列的和,不必求出最大的那个序列。例如: 序列:-2 11 -4 13 -5 -2,则最大子序列和为20。 序列:-6 2 4 -7 5 3 2 -1 6 -9 10 -2,则最大子序列和为16。 算法一: //穷举法,复杂度O(n^3) lo...

weixin_33851429的博客 349

《双剑合璧:双 IMU 驱动的高精度 AHRS 实战宝典(基于 ROS2)》

本文系统阐述了基于双IMU的高精度姿态与航向参考系统(AHRS)设计与实现方法。文章首先分析了传统单IMU系统的局限性,提出通过双IMU冗余配置实现性能互补的方案。从硬件设计要点(包括IMU选型策略、电路降噪方法、PCB布局规范),到算法实现方案(互补滤波、卡尔曼滤波等融合算法),再到ROS2软件架构与调优策略,全方位展示了双IMU系统的技术实现路径。特别强调快速性与高精度平衡的方法,包括动态参数调整、双IMU权重优化等核心技巧。最后总结了硬件降噪、算法调优等实用心法。

bother3000的博客 2026

嵌入式系统存储体系

主要分为三种:高速缓存(cache)、主存和外存。

weixin_43586667的博客 2265

输出最长公共子序列

给定字符串  输出最大的公共子序列  如果有多个输出任意一个  如果没有就输出0 #include #include int a[100][100]; char str1[1000]; int k=0,flag; void ok(int m,int n) {     //printf("%d %d\n",m,n);     if(m==0||n==0)         retu

编程中快乐 733

YOLOv8 WIOU

本文介绍了如何在YOLOv8中实现WIOU(Weighted Intersection over Union)的修改方法。主要修改了ultralytics/utils/metrics.py文件中的bbox_iou函数,新增了WIoU_Scale类,支持单调性FM v2、非单调性FM v3两种模式,并提供了动态调整的动量参数。修改后的函数支持多种IoU变体(GIoU、DIoU、CIoU等),通过数学公式实现了更精确的边界框回归损失计算,特别针对小目标检测场景进行了优化。该实现使用了PyTorch框架,包含完整

FJN110的博客 2056

最大子序列和算法分析——好的算法对于编程是多么重要!!!

昨天晚上在宿舍看Mark Allen Weiss老爷子的《数据结构与算法分析Java语言描述》的这本书,看到第二章的时候举了个例子来讨论,就是关于最大子序列和的算法分析。一共提了四个算法,首先当你看见第一个算法的时候觉得这个算法不错,可以实现,再接着当你看到后面连着的三个例子的时候这才明白算法一步步的优化对于整个性能的提升,有时候我们不是想不出来好的算法,只是当第一种算法出来得时候我们的...

152

华为OD机试真题 新系统 2026-04-19 Java&Go 实现【分辨率排序】

华为OD机试真题 新系统 2026-04-19 Python&JS 实现【分辨率排序】

MISAYAONE的博客 308

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

数据结构与算法分析(C语言描述)相对增长率、最大子序列和、对数运行时间

数据结构与算法分析(C语言描述) 1.引论 运行时间。 在许多问题当中,一个重要的观念是:写出一个可以工作的程序并不够。如果这个程序在巨大的数据集上运行,那么运行时间就变成了重要的问题。 分析方法。 数据结构分析中的结论的两个最常用的方法是归纳法和反证法。归纳法有两个标准的部分:基准情形与归纳假设。反证法即举出一个反例。 递归的四条法则。 基准情形:必须有某些基准的情形,它们不用递归就能求解;不断推进:对于那些需要递归求解的情形,递归调用必须能够朝着产生基准情形的方向推进;设计法则:假设所有的递归调用都能

weixin_46019384的博客 1159

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

最大子序列和的算法分析

// MaxSubsequenceSum.cpp : 定义控制台应用程序的入口点。 // 求数组的最大连续子序列和 // 2017/8/3#include "stdafx.h"int MaxSubsequenceSum1(int a[], int n); int MaxSubsequenceSum2(int a[], int n); int MaxSubsequenceSum3(int a[], i

小土豆的博客 392

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数据结构与算法分析之最大子序列和

问题描述:给定整数A1,A2......AN(keng)

nerd_coder 681

最大子序列和算法分析

近日学校oj上出现一道最大子序列和的问题,穷尽脑筋,也只能暴力枚举。之后想了很久,得出以下几种优化算法。题目:小猫咪玩游戏,现在有n张牌依次放在地上,牌上有数字,数字的范围是-20~20,正数表示可以奖励对应数目的猫粮,负数表示减去对应数量猫粮。猫咪可以从中连续选择k张牌, 0

Xudong_12345的博客 234

“最大连续子序列和”、“最大递增子序列”、“最大公共子序列”、“最长公共子串”问题总结【持续更新ing】

一、最大连续子序列和(最大子序列) 最大子序列是要找出由数组成的一维数组中和最大的连续子序列。比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大;而 {5,-6,4,2}的最大子序列是{4,2},它的和是6。 思路:只要前i项的和还没有小于0那么子序列就一直向后扩展,否则丢弃之前的子序列开始新的子序列,同时我们要记下各个子序列的和,最后找到和最大的子序列。 ...

u011947630的博客 2428

数据结构与算法分析——最大子序列和问题

最大子序列和问题

weixin_39407955的博客 483

二、算法分析之最大子序列和

[size=medium]最大子序列和问题的求解[/size] 第一个算法如下,用穷举的方法求出所有的子序列和,返回最大值。 [code="java"] public static int maxSubSumBad(int[] a){ int maxSum=0; for(int i=0;i0) return a[left]; else return 0...

liwenjing0312的博客 195

算法分析学习日志(二):最大子序列和问题

最大子序列和问题是非常经典的算法问题,它的各种解法也常见于各类算法教材,本文将用一个简单的实验,来展示在处理该问题的过程中,优化算法的重要性。 最大子序列和问题的描述为:在给定一列整数的情况下,求取其所有子序列的和的最大值。在本文中,我们生成一个整数数量为500,取值范围为[-10,10]的随机整数列作为样例,验证不同算法所需要的时间。 生成随机数的代码如下: #include #in

qq_28955085的博客 241

数据结构与算法分析 C 语言描述第二版第二章 最大子序列和问题

Maximum Subsequence Sum Problemdivide and conquerRunning time Maximum subsequence sum problem: Given (possibly negative) integers A1,A2,⋯ ,ANA_1, A_2, \cdots ,A_NA1​,A2​,⋯,AN​, find the maximum value ...

ALWAYS LEARNING 362

java最大子序列和算法分析

/** * 算法一 */ public int maxSubSum(int []a){ int maxSum = 0; for(int i=0;i

202

数据结构与算法分析 2-算法分析-以“最大的子序列和”为例

一、数学基础1.定义2.定义的解释3.级别的判断方法4.结论。

virtualxiaoman的博客 182
上一篇: 奇数阶幻方
下一篇: Linux学习笔记(一)
marwi_study
博客等级 码龄8年 82粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值