#计算之魂共读笔记——将例题1.3线性复杂度的算法写成伪代码

例题1.3 总和最大区间问题
给定一个实数序列,设计一个有效的算法,找到总和最大的区间

1.正反两遍扫描法伪代码(简单情况)
时间复杂度O(N)

step1: 从左往右将序列第一个正数之前的元素删除;
step2: 从右往左将序列最后一个正数之后的元素删除,此时序列的元素个数由K缩减为k;
step3: 正向依次扫描序列:
           依次记录如下3个值:
                        1~q的和:S(1,q),
                        前向扫描最大值: maxf,
                        最大值的右边界:r
step4: if 存在q0, 当q>q0时,S(1,q)>=0:
step5: 当扫描到q=k时,保留maxf对应的右边界r;
step6: 反向依次扫描序列:
           依次记录如下3个值:
                        p~k的和:S(p,k),
                        反向扫描最大值: maxb,
                        最大值的左边界:l
step7: if 存在p0, 当p<p0时,S(p,k)>=0:
step8: 当扫描到p=1时,保留maxb对应的左边界l;
step9:     输出序列总和最大的区间为:[l,r]

2.正反两遍扫描法伪代码(复杂情况)
时间复杂度:O(N)
step1: 从左往右将序列第一个正数之前的元素删除;
step2: 正向依次扫描序列:
           依次记录如下3个值:
                        1~q的和:S(1,q),
                        目前最大值: max,
                        最大值的右边界:r
step3: if S(1,q)<0:
step4: 从q开始反向计算maxb;
           依次记录如下3个值:
                        p~q的和:S(p,q),
                        反向扫描最大值: maxb,
                        最大值的左边界:l1
step5: 第1个局部和最大区间:[1,q]间的和最大区间为:[l1,r1]
step6:从q+1开始扫描序列,重复step2
step7:if S(1,q2)<0:
step8: 从q2开始反向计算maxb;
           依次记录如下3个值:
                        p~q的和:S(p,q),
                        反向扫描最大值: maxb,
                        最大值的左边界:l2
step9: 第2个局部和最大区间:[1,q2]间的和最大区间为:[l2,r2]
step10: 从左往右不断扫描序列,依次得到局部最大区间[li,ri]和maxi(i=1,2,3......)
step11: if maxi > max:
             max  = maxi
step12: 整个序列的总和最大区间:max对应的局部和最大区间[l,r]

备注:图书勘误:
p41 倒数第4行  
步骤4  最大区间[li,rr]应改为最大区间[li,ri]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值