最大子数组问题(分治法)

最大子数组问题(分治法)

时间算法度 Θ ( n l g n ) Θ\left(nlgn\right) Θ(nlgn)


该算法主旨
归并排序算法完全遵照分治模式得三个步骤:

  • 分解:分解 n n n个元素的序列,使其成为各具 n / 2 n/2 n/2个元素的两个子序列。
  • 解决:使用 “寻找最大子序列函数” 递归地寻找两个子序列中最大得子序列。
  • 合并:比较两个已寻找到的子序列以产生最大得子序列。

当待排序的序列长度为 1 1 1时,递归"开始回升",因为长度为 1 1 1的序列都已排好序(或者说时不需要排序)


伪代码

/* ——————————————————————————————————————————————————————
 * 寻找最大子数组函数
 * —————————————————————————————————————————————————————— */
FIND_MAX_CROSSING_SUBARRAY(A, low, mid, high)
1   left_sum = 0
2   sum = 0
3   max-left = 0
4   for i = mid downto low
5       sum = sum + A[mid]
6       if sum > left-sum
7           max-left = i
8           left-sum = sum
9   right-sum = 0
10  sum = 0
11  max-right = 0
12  for i = mid + 1 to high
13      sum = sum + A[i]
14      if sum > right-sum
15          max-right = i
16          right-sum = sum;
17  return {
    max-left, max-right, left-sum + right-sum }

/* ——————————————————————————————————————————————————————
 * 分治算法
 * —————————————————————————————————————————————————————— */
Divide_And_Conquer_Solution(A, low, high) 
1   if high == low
2       return {
    low, high, A }
3   else
4       mid = (low + high) / 2
5       (left-low, left-high, left-sum) = Divide_And_Conquer_Solution(A, low, mid)
6       (right-low, right-high, right-sum) = Divide_And_Conquer_Solution(A, mid + 1, high)
7       (cross-low, cross-high, cross-sum) = FIND_MAX_CROSSING_SU
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值