求解最大子数组问题的三种方法

求解最大子数组问题的三种方法

标签(空格分隔): 算法 分治 最大子数组



算法导论中有这样一个例子来引出最大子数组问题:
在股市中,人们为了获取更大利益,希望“低价买进,高价卖出”,从而获得最大收益。然而,简单的以最低价格买入,最高价格卖出并不能获得最大收益。我们可以不直接观察每日股票的价格,而是考虑每日股票的价格变化值。第 i 天的价格变化值定义为第 i 天的价格减去第 i1 天的价格。如果将这些值看成一个数组A,那么,问题就是求A的和最大的非空连续子数组,即最大子数组(maximum subarray)。

  • 输入:数组 A={ 13,3,25,20,3,16,23,18,20,7,12,5,22,15,4,7}
  • 输出:最大子数组的和 43

  • 暴力解法

    • 算法思想
      枚举数组中所有连续子序列的和,并求出其中的最大值。
    • 代码

      int max_sub_array_tolient(int a[],int n){
      int this_sum;
      int max_sum = 0;
      for(int i=0;i<n;i++){
          for(int j=i;j<n;j++){
          this_sum = 0;
          for(int k = i;k<=j;k++){
              this_sum += a[k];
              if(this_sum>max_sum)
                  max_sum = this_sum;
          }
      }
      }
      return max_sum;
      }
      
    • 算法分析
      很明显,上述代码嵌套三层循环,需要的时间复杂度为 O(n3) .

  • 分治解法
    分治法(divide andconquer)是一种基于多分枝递归的算法范式。顾名思义,分治就是“分而治之”,即将原问题分解为两个或多个子问题,直到分解为不能分解的子问题,然后将这些问题合并成原问题的解。

    • 算法思想
      假设我们要寻找 A[low...high] 的最大子数组。我们需要将子数组划分为两个规模大致相等的子数组。即我们将数组 A[low...high] 划分为 A[low...mid]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值