分治策略之最大子数组问题

从股票买卖问题转换成为一个求最大子数组问题

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
价格 100 113 110 85 105 102 86 63 81 101 94 106 101 79 94 90 97
变化 13 -3 -25 20 -3 -16 -23 18 20 -7 12 -5 -22 15 -4 7

暴力求解所花费的时间是O(n^2)

采用分治技术来求解最大子数组问题,假定要求的数组为A[low..high]的最大子数组。

将子数组划分为两个规模尽可能相等的子数组,也就是说找到子数组的中央位置,比如mid,然后考虑求解两个子数组:

A[low..mid]和A[mid..high]的最大子数组,然后还一个是跨越中点的子数组。

下面是一个示意图

时间: 2024-08-05 12:36:43

分治策略之最大子数组问题的相关文章

分治策略---求最大子数组

只有当数组中包含负数时,最大子数组问题才有意义.如果所有元素都是非负的,最大子数组问题没有任何意义,因为整个数组和肯定是最大的 1 public class FindMaxSubArrayDemo { 2 public static void main(String[] args) { 3 int[] arr = {13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7}; 4 int[] result_arr = fi

使用分治算法求解最大子数组问题

def MaxCrossSubarray(num,mid,low,high): leftsum=0 leftmax=-1000000 rightsum=0 rightmax=-1000000 for i in range(mid,low-1,-1): leftsum=leftsum+num[i] if leftsum>leftmax: leftmax=leftsum leftlow=i for j in range(mid+1,high+1): rightsum=rightsum+num[j]

第四章 分治策略 4.1 最大子数组问题 (暴力求解算法)

/** * 最大子数组的暴力求解算法,复杂度为o(n2) * @param n * @return */ static MaxSubarray findMaxSubarraySlower(int[] n) { long tempSum = 0; int left = 0; int right = 0; long sum = Long.MIN_VALUE; for (int i = 0; i < n.length; i++) { for (int j = i; j < n.length; j++

第四章 分治策略 4.1 最大子数组问题 (减治法,别人的,拿来看看)

/** * 获得连续子数组的最大和 * * @author dfeng * */ private static long getMax(long a, long b) { return a > b ? a : b; } /** * 获得连续子数组的最大和 * * @param array * @return 最大和,此处用了Long型是为了表示当参数为null或空时,可以返回null,返回其它任何数字都可能引起歧义. */ public static Long getMax(int[] arra

第四章 分治策略——最大子数组问题

最大子数组问题 方法一:暴力求解方法 我们可以很容易地设计出一个暴力方法来求解本问题:简单地尝试没对可能的子数组,共有O(n2)种 #include<iostream> using namespace std; #define INT_MIN 0x80000000 int main() { int arr[10]={9,8,-3,-5,7,-39,79,-37,8,9}; int i,j; int sum=0,maxsum=INT_MIN; int imax; for(i=0;i<10;

第四章 分治策略 4.1 最大子数组问题(自己想的,不知道是不是减治法)

package chap04_Divide_And_Conquer; import static org.junit.Assert.*; import java.util.Arrays; import org.junit.Test; /** * 算反导论第四章 4.1 最大子数组 * * @author xiaojintao * */ public class Maximum_Subarray_Problem { /** * 最大子数组类 left为头部索引,right为尾部索引,sum为数组和

最大子数组问题(分治策略实现)

在算法导论4.1最大子数组问题中首先提出的是暴力求解方法即计算所有子数组的组合,然后求其和,寻找最大值.这种方法运行时间为Ω(n^2).然后提出有没有更好的方法. 使用分治策略的求解方法: 寻找子数组A[low..high]的最大子数组,使用分治技术意味着要将子数组划分为两个规模尽量相等的子数组.也就是说,找到子数组的中央位置(比如mid),然后考虑求解两个子数组A[low..mid]和A[mid..high].A[low..high]的任何连续子数组A[i..j]所处的位置必然以一下三种情况之

分治策略 &nbsp; 最大子数组问题

递归式 递归式与分治方法是紧密相关的,因为使用递归式可以很自然地刻画分治算法的运行时间.一个递归式就是一个等式或不等式,它通过更小的输入上的函数值来描述一个函数.例如,在2.3.2节,我们用递归式描述了MERGE-SORT过程的最坏情况运行时间T(n): Θ(1)        若n=1 T(n) =                         (4.1) 2T(n/2)+Θ(n)    若n>1 求解可得T(n)=Θ(nlgn) 递归式可以有很多形式.例如,一个递归算法可能将问题划分为规模

用分治和递归的思想——寻找最大子数组

寻找最大子数组的问题可描述为 输入: 一个数组,一个低位,一个高位 输出: 数组中从低位到高位中,连续和最大是多少 首先能想到的最直接的办法是暴力解决,遍历所有可能的序列组合,如果有n个元素,则需遍历的子序列有,复杂度为n2,稍有些经验的就能马上意识到,有很多重复计算在里面,比如最长的子序列计算,包含了之前所有子序列的计算.接下来我们使用分治的思想求解这个最大子序列,前一篇博文提过,分治的思想是将大问题分解为同等类型的子问题,再将子问题求解,然后合并子问题得出原问题的解,其中用到了递归的思想,因