找回密码
 注册
关于网站域名变更的通知
查看: 362|回复: 1
打印 上一主题 下一主题

《算法导论(第三版)》第四章4.1,使用分治策略求最大子数组问题。

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-3-11 11:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
《算法导论(第三版)》第四章4.1,使用分治策略求最大子数组问题。
2 M0 @/ V' Q& a, t# R& G; F% T9 x$ [9 ?$ v% x( e2 ^5 I% C0 e: {6 y4 c# W
主函数:
# d& O5 q& G+ A6 S; d% j
  • clear;clc
  • A=[13 -3 -25 20 -3 -16 -23 18 20 -7 12 -5 -22 15 -4 7];%例 源数组
  • [low,high,sum1]=FIND_MAXIMUM_SUBARRAY(A,1,length(A))%求解
  • A(low:high)%展示结果
  • ! b8 |. D8 k! B% P! {

8 w, [7 [1 J$ f; e3 Z, o* u
. `9 n, B- K* ^) r* v1 O. }( ~
* }  Z: G4 W4 c. ~/ @
递归函数:7 I# I. b  h' [$ T& X" |( v2 ~
  • function [low,high,sum1] = FIND_MAXIMUM_SUBARRAY(A,low,high)
  • %输入,[源数组,左边界,右边界]
  • %输出,[左边界,右边界,边界内最大子数组的和]
  • if low==high %两侧仅剩单个数值时,直接返回数字
  •     sum1=A(low);
  • else %如果不是单个数字,则进行递归分解成三部分
  •     mid=floor((low+high)/2);%定义中间值
  •     [left_low,left_high,left_sum]=FIND_MAXIMUM_SUBARRAY(A,low,mid);%分解左子数组,并求子数组的值
  •     [right_low,right_high,right_sum]=FIND_MAXIMUM_SUBARRAY(A,mid+1,high);%分解右子数组,并求子数组的值
  •     [cross_low,cross_high,cross_sum]=FIND_MAX_CROSSING_SUBARRAY(A,low,mid,high);%求出跨界子数组的值
  •     %将三种结果做比较,返回最大的情况
  •     low=[left_low,right_low,cross_low];
  •     high=[left_high,right_high,cross_high];
  •     sum1=[left_sum,right_sum,cross_sum];
  •     [sum1,addr]=max([left_sum,right_sum,cross_sum]);%
  •     low=low(addr);
  •     high=high(addr);
  • end   
  • end

  • 4 x& D( N/ Y$ [* v$ L: U" n
: J* R  O- v& y: @* a+ b
[color=rgb(51, 102, 153) !important]复制代码

! d- x8 U2 H6 f/ q8 X
. a. z( U( j; S) I5 L  K求解函数:
3 w# c7 o. N; b( ~, `  |4 N
  • function [max_left,max_right,sum3] = FIND_MAX_CROSSING_SUBARRAY(A,low,mid,high)
  • %求左侧的最大子数组
  • left_sum=-inf;%最大子数组的和
  • sum1=0;%子数组和的累计
  • for i=mid:-1:low%序数
  •     sum1=sum1+A(i);%累计
  •     if sum1>left_sum%判断最大子数组
  •         left_sum=sum1;%最大子数组的值
  •         max_left=i;%最大子数组的左侧截止位置
  •     end
  • end
  • %求右侧的最大子数组
  • right_sum=-inf;%最大子数组的和
  • sum2=0;%子数组和的累计
  • for j=mid+1:high
  •     sum2=sum2+A(j);
  •     if sum2>right_sum
  •         right_sum=sum2;
  •         max_right=j;%最大子数组的右侧截止位置
  •     end
  • end
  • sum3=left_sum+right_sum;%两侧最大子数组之和
  • end

  • - J1 f. \9 H: G9 n/ A
# R- R& X. S' e  P- f
, y) i; a3 E  ^. \: [
0 ~4 V& Z/ l5 a- J( l

该用户从未签到

2#
发表于 2020-3-11 16:49 | 只看该作者
使用分治策略求最大子数组问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 19:35 , Processed in 0.156250 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表