第八章 算法设计技术

算法设计技术与方法 分别实现多项式求值的四种运算,若针对不同规模的输入值a,各算法的运行时间,分别实现多项式求值的四种运算,若针对不同规模的输入值a,各算法的运行时间。 分别实现矩阵相乘的3种算法 立即下载

问题:输入是具有n个浮点数的向量x,输出是输入向量的任何连续子向量中的最大和,认为当所有的输入都是负数时,总和最大的子向量是空向量,总和为0。例如,如果输入向量包含下面10个元素:


那么该程序的输出为x[2..6]的总和,即187。


书中主要提到了3中不同的算法,其时间复杂度也各不相同。

1.平方算法

主要是通过遍历数组中数来计算出连续子向量的最大和,时间复杂度为O(n^2)。

平方算法的伪代码如下:

maxsofar=0
for i=[0,n)
	sum=0
	for j=[i,n)
		sum+=x[j]
		maxsofar=max(maxsofar, sum)

2.分治算法

该算法主要是基于如下的分治原理:要解决规模为n的问题,可递归地解决两个规模近似为n/2的子问题,然后对它们的答案进行合并以得到整个问题的答案。

在本例中,初始问题要处理大小为n的向量,所以将它划分为两个子问题的最自然方法就是创建两个大小近似相等的子向量,分别成为a和b。

然后递归地找出a,b中元素总和最大的子向量,分别称为ma和mb。


最大子向量要么整个在a中,要么整个在b中,要么跨越a和b之间的边界。我们将跨越边界的最大子向量称为mc。

分治算法将递归地计算ma和mb,并通过其他某种方法计算mc,然后返回3个总和中的最大者。

为了计算mc,通过观察可以发现,mc在a中的部分是a中包含右边界的最大子向量,而mc在b中的部分是b中包含左边界的最大子向量。

将这些因素综合到一起就得到了下面的算法伪代码:

float maxsum(l,u)
	if(l>u)
		return 0
	if(l==u)
		return max(x[l], 0)
	m=(l+u)/2
	// find max across to left
	lmax=sum=0
	for(i=m;i>=l;i--)
		sum+=x[i]
		lmax=max(lmax, sum)
	// find max across to right
	rmax=sum=0
	for i=(m,u]
		sum+=x[i]
		rmax=max(rmax, sum)
	return max(maxsum(l,m), maxsum(m+1,u), lmax+rmax)

算法的最初调用:maxsum(0,n-1)

时间复杂度为O(nlogn),有多种方法可以证明其运行时间。
1,一种非正式的论证是,该算法在每层递归中都执行了O(n)次操作,而总计有O(logn)层递归。
2,更精确的论证可以通过递归关系完成。若用T(n)表示解决规模为n的问题所需的时间,那么T(1)=O(1)且T(n)=2T(n/2)+O(n)  可知该递推关系的解为 T(n)=O(nlogn)。


3.扫描算法

现在采用操作数组的最简单的算法:从数组最左端(元素x[0])开始扫描,一直到最右端(元素x[n-1])为止,并记下所遇到的最大总和子向量。最大总和的初始值设为0。假设我们已解决了x[0..i-1]的问题,那么如何将其扩展为包含x[i]的问题呢?我们使用类似于分治算法的原理:前i个元素中,最大总和子数组要么在前i-1个元素中(将其存储在maxsofar中),要么其结束位置为i(将其存储在maxendinghere中)。


算法伪代码如下:

maxsofar=0
maxendinghere=0
for i=[0,n)
	maxendinghere=max(maxendinghere+x[i], 0)
	maxsofar=max(maxendinghere, maxsofar)
算法的时间复杂度为O(n)。


SOLIDWORKS转CAD字体终极选择:TrueType vs SHX,哪个才是你图纸协作的“安全牌”? 本文深入探讨SOLIDWORKS转CAD工程图中的字体选择问题,对比TrueType与SHX字体在DWG文件协作中的表现。通过真实案例揭示字体映射的兼容性陷阱,提供企业级字体管理方案,帮助工程师规避版本差异、系统依赖和法律风险,确保图纸协作的稳定性。 阅读详情

相关推荐

S-function入门及案例详解(1)——S-function基础介绍及基本案例

本专题将用三篇文章对S-function进行介绍及其案例详解。欢迎关注~ 目录一、S-Function简介二、详解sfuntmpl函数2.1 sfuntmpl函数介绍2.2 mdlInitializeSizes函数2.3 mdlDerivatives函数2.4 mdlUpdate函数2.5 mdlOutputs函数2.6 mdlGetTimeOfNextVarHit函数2.7 mdlTerminate函数三、案例1——对波形的幅值进行放大3.1 案例分析3.2 案例详解3.3 输出波形四、案例2——对波形的

Wendy的博客 7万+

求输入向量的任何连续子向量中的最大和

问题的输入是具有n个浮点数的向量x,输出是输入向量的任何连续子向量中的最大和。,例如,如果输入向量包含下面10个元素: 31,-41,59,26,-53,58,97,-93,-23,84 那么该程序的输出为x[2..6]的总和,即187。当所有的数都是正数时,问题就很容易解决,此时最大子向量就是整个输入向量。当输入向量中有负数时就有麻烦了:是否应该包含某个负数时希望周围的正数会弥补它呢?为了使

繁小华的专栏 1250

避坑指南:中国地面气候日值数据集(V3.0)处理中的常见错误与解决方案

本文详细解析了中国地面气候日值数据集(V3.0)处理中的常见错误与解决方案,包括数据清洗、特征值解码、时间序列处理和质量控制等关键步骤。通过Python实战代码示例,帮助研究者高效处理这一包含全国699个气象站多要素日值数据的数据集,避免常见陷阱,提升气候变化研究和农业气象分析的准确性。

xray4的博客 1027

最大连续子向量(分治策略和扫描算法)

问题及简单算法 本章引入的问题来自一维的模式识别,问题的输入是具有n个浮点数的向量x,输出是输入向量的任何连续子向量中的最大和。  例如,如果输入向量包含以下 N = 10 个元素:  arr[N] = { 31, -41, 59, 26, -53, 58, 97, -93, -23, 84 }  那么该程序的输出为x[2…6]的总和,即187。  该问题分为以下几种情况:

Smile&搁浅 1001

白话机器学习算法理论+实战番外篇之Xgboost

1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Adaboost等 无监督算法:聚类,降维,关联规则, PageRank等 我前面已经尝试用最白话的语言完成了一个白话机器学习算法理论+实战系列,这个系列已经基本包含了上面这些算...

Miracle8070 1万+

心理学量表汇总 50多个 附下载

目录一、心理健康与精神病态量表二、行为问题量表三、人格评估量表四、智力测验一、心理健康与精神病态量表1.一般症状自评量表(SCL-90)症状自评量表 (The self-report symptom inventory ,Symptom checklist ,90,简称 SCL90) 有 90 个评定项目 , 每个项目分五级评分 , 包含了比较广泛的精神病症状学内容, 从感觉、 情 感、思维、意识、行为直至生活习惯、人际关系、饮食等均有涉及,能准确刻划被试的自觉 症状,能较好地反映被试的问题及其严重程度和变

南七小僧的学海无涯 1904

编程珠玑第八章 算法设计艺术

问题描述: 一个具有n个浮点数字的数组x,目标是要找到之中连在一起的数组元素中找到最大和。例如如果输入的数组是以下这十个元素: 31 -41 59 26 -53 58 97 -93 -23 84 那么程序应该返回从59到97的综合,也就是187。第一个算法迭代了所有满足 0 ≤ i ≤ j < n 的 i 和 j 整数对,分别计算总和,最终找到综合最大的组合。 问题定义:...

weixin_30595035的博客 230

MOSFET关断尖峰电压的机理与抑制

MOSFET在电力电子系统中存在开关尖峰电压/电流问题,主要源于寄生电感、密勒电容及开关瞬态特性。尖峰会引发过压击穿、功率损耗和EMI干扰。抑制措施包括优化驱动电路、添加缓冲网络(RC/RCD)、降低寄生电感(改进PCB布线/封装)、使用快速二极管及远端负载特殊处理(电抗器/滤波器)。系统性的器件选型与电路设计是确保功率电子稳定运行的关键。

硬核科技 1824

编程珠玑笔记 ~~ 性能部分

3. 数据结构程序(略过)   4. 编写正确的程序        1.在返回值p中返回元素t在数组x中第一次出现时的位置。(如果t在数组中多次出现的话,原先的算法所返回的是众多位置中的任意一个)。代码应该对数组元素进行对数次比较,可能要进行logn次这样的比较才能完成二分查找 补充:(临时想到的一个题目) 查找一个数组中出现次数超过数组元素总数一半的数字   1. 是否排序

Fly Follow the Heart 1220

蓝牙攻防实战:蓝牙技术详解

蓝牙作为轻量级、低功耗的无线通信技术,其设计兼顾了效率与灵活性,但也留下了诸多安全隐患。随着物联网设备的爆发式增长,蓝牙的攻击面也在不断扩大。理解其底层通信机制、协议栈结构以及配对加密逻辑,是提升无线安全防护能力的关键。

idlecloud0105的博客 740

假新闻检测论文分享(25)L-DefenseExplainable Fake News Detection With Large Language Model

现有的假新闻检测工作主要集中在通过深度网络结合多种信息来学习假新闻的潜在特征,如可信度、立场、传播模式、额外知识、域外数据等。尽管他们在探测上取得了成功,但受限于他们的黑箱性质,他们无法提供任何对公众至关重要的理由。为解决这一问题,一些研究致力于可解释假新闻检测(EFND),旨在同时生成准确性预测和解释。许多工作通过注意力机制在相关报道中注意突出特别的单词、短语或句子来提供可解释性。然而,这些工作只发现了对最终预测有高贡献的区域,缺乏直观和可信的解释。

weixin_41964296的博客 732

分治法求最大值c语言思想,整数的除法 分治思想 求最大子向量和

1程序中整数的除法C语言中,两个整数相除的符号为’/’。若dd和d为两个整数,则dd/d的值是dd除以d的商。若是需要a除以b的余数,则此余数可表示为a % b(%只能应用于两整数)。一般的,在程序中,dd、d为两整数,根据q= dd / dr= dd % d可得以下结论:(dd – l)/ d= q,l= [0, r]。m / d= q,m= [dd, (q + 1) * d)。对于余数r,...

weixin_33782296的博客 409

第一章:基础知识 - 概念与基础,理解什么是功耗

电源管理与功耗调优:实战项目经验分享

坚韧与专注 885

【编程珠玑】第八章 算法设计技术

一,概述        问题:求一维数组中连续子向量的最大和。        例如:a[6]={3,4,-2,-9,10,8}; 则最大连续子向量的和 为 10+8 = 18        1)解法一:简单算法 #include #define max(a, b) ((a)>(b)?(a):(b)) int main() { int a[6]={3,4,-2,-9,10,8}

小田的专栏 2859

WINCC7.3破解文件

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

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

编程珠玑第八章-算法设计技术

本章就一个小问题研究了四种不同的算法,重点强调了这些算法的设计技术,综合本章内容,告诉我们:复杂深奥的算法有时可以极大地提高程序性能。 问题定义: 具有n个浮点数的向量x,求出输入向量的任何连续子向量的最大和。 立方算法: maxsofar = 0; for i = [0,n)     for j=[i,n)         sum = 0;         for k=

日新为道的专栏 1039

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

《编程珠玑》学习记录第八章算法设计技术

算法的设计这个问题太过庞大,对于一个程序员来说,最好的办法就是多接触不同的算法,并且时刻总结。 问题:一个一维的整数数组,有N个元素,元素有正数也有负数。找到数组中任意连续个元素最大和。 分析:其实这是一个典型的动态规划问题,但是书中给了好几种方法,虽然有些方法不是最优的,但是分析问题的过程是很值得借鉴的。 方法一:使用暴力法找到所有的子序列,并计算出所有子序列的和,结果自然就得到了。这种方法的事件复杂度是O(n*n) vector<int> testArray = {31, -41,

请叫我少爷的博客 369

VB摄像头监控

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

编程珠玑第八章-性能之算法设计技术

一.给定一个n元的向量(正负值),如何求最大的连续子向量? 首先贴一下书中伪代码的Java实现及我的理解package chapter8;import javax.xml.crypto.AlgorithmMethod;//给定n个具有浮点数的向量,求出连续子向量值的最大和 //划归为计算arr[i]到arr[j]的和问题 public class t0 { //第一个算法就是先用两个循环

YellowStar5 927

上交大版C语言程序设计第八章

qq_40445993的博客 507

第八章二重积分

m0_58976684的博客 255

第八章习题

【代码】第八章习题。

2401_87166065的博客 171
上一篇: 第四章 编写正确的程序
下一篇: 第九章 代码调优
ProfessionalEngineer
博客等级 码龄19年 295粉丝 154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值