- A+
领500g书库,关注公众号:程叫兽的宝藏 (长按可复制!)
热门下载区==>点此链接进入<<<
目录(点击切换)
本文节选自《计算之魂》电子版:
//计算之魂/表1.2改动后的元素、前向累计之和和后向累计之和Ah3[1[2|3|4[5|6[7[se|tlalazla元素|15|一23|3.2|=-55-123.2|321一14|=622|442154.|一7.8111|1=4.91.5|一10.8|1一7.61一13110.1|友:311419|-50.31一6了1一0.71=8.5|一7.41|一123后向累计一t2.3|=13.8|1=1.5|一47|0.8|一22.4|1一25.6|一24.2138|一621一11.6|一3.81一4.9|从表1.2中可以看出,从前往后累加最大值出现在一6的位置,而反过来从后往前累加,最大值出现在二9的位置。右边界反而在左边界的左边。上述算法显然要出错。造成这个问题的原因是从一开始票加的总和在遇到第8个元素时下跌到零以下,然后一直在零以下。这样一来,原本区间[9,10]之间的元素之和为49.6,它应该是总和最大区间,但是在累加了前8个元素之后和依然小于零,因此我们找不到,如图1.3所示。一一元素-一-前向累计之和图1.3前向累计之和在某个位置之后就一直小于零的情况,其峰值在后向累计之和峰值之前后
计算之魂主要内容
向累计之和为了解决这个问题,我们需要对步骤2和步骤3稍作改进。步骤2,我们先把左边界固定在第一个大于零的位置,假设为P,然后让9g=D,p+1,…;大,计算SP,9,以及到目前为止的最大值Max和达到最大值的右边界r。如果我们算到某一步时,发现%p,4)<0,这时,我们需要从位置4开验,反向计算Mab,并且可以确定从第1个数到第4个数之间和最大的区间,我们假定它为由m,这个区间的和为Mar。特别值得指出的是,1其实等于P。为什么呢?如果)和关忆,根据我们对这种情040/第1章//毫厘干里之差一-大O概念1//二况的假设,S(p,i-D=0,于是就有SU站)=Sw,-D+SOr二Sr)=Maxr,这就与[岂站]是到9为止和最大的区间相矛盾了。步骤3,我们从9+l开始往后扫描,重复上述过程。先是找到第一个大于0的元素,从那里开始做累加操作,可能在遇到某个9时,又出现S(q+1.9)<0的情况了,这时我们得到第二个局部和最大区间[忆问,相应的区间之和为Ma。现在,我们需要确定,从头开始到4时和最大的区间。我们只需要比较一下Merx、ap和Walesarsn+loD[也就是Su7)]这三个数值,最大
计算之魂epub
的区间和必然在这三者之间。我们先否定掉Sm)的可能性。于So+lm)=S(9+12一D+SCO记)<S0m),故Sa+1,D一1)<0【IT也就是说从第一次累加结束,到第二个局部和最大区间开始之前,中间所有的元率之和小于0。同时,由于SurDt+sm+rL9g)FSCrD+SCOn+1L9)=-SC,9)<0《1.2)综合不等式〈1.1)和不等式〈1.2),我们就得到Maxi+S(i+T1LLTD=SCOr)+HS(On+L)+S(9+12一)<0(3也就是说SCm)=Mdaxi+MaxHSUri+1D-1)<hax,(1.4)这样一来,从序列头开始到9时和最大的区间要么是由站,要么是[旋mm],不可外在这两段之间,我们只要将二者之中更大的区间保留到中间变量Max和[&z]中即可。步骤4,采用与步骤3'同样的方法,不断往后扫描整个序列,得到一个个局部和最大的区间必站和相应的部分和Max,然后比较Max和Mar,决定是否更新Max。最后,这样得到的局部和最大区间[47],就是整个序列的总和最大区间。为了让大家对简单情况和复杂情况有更直观的印象,下面再用两个极端一点的例子来说明。GCC041
计算之魂免费
| 计算之魂内容简介 | 计算之魂作者 |
| 计算之魂免费 | 计算之魂网盘 |
| 计算之魂百度百科 | 吴军计算机之魂书籍下载 |
综上:吴军的新作计算之魂值得推荐阅读

