【说人话的算法小课堂】使用分治法求最大连续子序列的和

本文介绍了如何运用分治法求解一个整数数列的最大连续子序列和。当数列长度为1时,取唯一元素;否则,分为三类情况:子数列位于数列左半部分、右半部分或横跨两部分,并递归处理。算法的时间复杂度为O(n log n),优于暴力求解的O(n^2)。
摘要由CSDN通过智能技术生成

使用分治法求最大连续子序列的和

设有一个整数数列a[n],1≤s, t≤n。求a[n]的一个子数列a[s, t],使得该子数列的和尽可能大。
若这个和小于0,则输出0。

【算法本体】

(参考代码中,因为要与暴力法对比运行时间,而暴力法用到前缀和,为了方便,数组下标从1开始)
设m = floor((s + t) / 2)。
当n = 1时,直接取唯一的元素作为结果。若该元素为负,则输出0。
当n > 1时,分3种情况讨论:
【情况1】该子数列完全落在原数列的左半部分a[s, m]。递归对数列a[s, m]求其最大连续子序列的和。
【情况2】该子数列完全落在原数列的右半部分a[m + 1, t]。递归对数列a[m + 1, t]求其最大连续子序列的和。
【情况3】该子数列横跨左右两部分,则【情况1】和【情况2】中的递归求解算法无法求出此类连续子数列的最大和。对此类子数列,只需要从中点m开始向两侧分别累加每个元素直到数列两端,就求得了此种连续子数列的最大和。
最后,针对3种情况求出的连续子序列的和,选取最大的作为最终结果。

【时间复杂度】

在该算法中,如果对长为n的数列求其最大连续子数列的和,那么需要对左右两段长为n / 2的子数列递归求解,再将递归求解无法顾及的横跨左右两半的子数列求解。所以
T(1)=O(1),n=1
T(n)=2T(1/2 n)+O(n),n>1
解得T(n) = O(n log n)。
与暴力算法对比:
暴力算法的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值