博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分治法求数组中连续和最大子数组
阅读量:6675 次
发布时间:2019-06-25

本文共 3032 字,大约阅读时间需要 10 分钟。

一、暴力解法实现

输入一个整形数组,求数组中连续的子数组使其和最大
对数组内每一个数A[i]进行遍历,然后遍历以它们为起点的子数组,比较各个子数组的大小,找到最大连续子数组

public  static  void MaxArray(int[] array)        {            int maxValue = array[0]; //记录最大子数组的和            int minIndex = 0;//记录子数组的底            int maxIndex = 0;//记录子数组的高            for (int i = 0; i < array.Length; i++)            {                for (int j = 0; j < array.Length; j++)                {                    //所遍历出来的子数组的和                     int temp = 0;                       //计算遍历的子数组之和                    for (int k = i; k <=j; k++)                    {                        temp += array[k];                    }                    if (temp>maxValue)                    {                        maxValue = temp;                        minIndex = i;                        maxIndex = j;                                           }                }            }            Console.WriteLine("最大子数组的和是:{0},索引的起始位置:{1},结束位置:{2}",maxValue,minIndex,maxIndex);        }

二:分治法

因为最大子序列和可能在三处出现,整个出现在数组左半部,或者整个出现在右半部,又或者跨越中间,占据左右两半部分。递归将左右子数组再分别分成两个数组,直到子数组中只含有一个元素,退出每层递归前,返回上面三种情况中的最大值。
使用分治技术意味着我们要将子数组划分为两个规模尽量相等的子数组,也就是找到子数组的中央位置(比如mid),然后考虑求解两个子数组A[low…mid]和A[mid+1…high]。A[low…high]的任意连续子数组A[i…j]所处的位置必然是以下三种情况之一:

(a)完全位于子数组A[low…mid]中,因此low≤i≤j≤mid

(b)完全位于子数组A[mid+1…high]中,因此mid≤i≤j≤high

(c)跨越了中点,因此low≤i≤mid≤j≤high

所以我们需要求解这三种情况的最大子数组,然后再取最大值。A[low…mid]和A[mid+1…high]可以递归求解,剩下的就是训中跨越中点的最大子数组

在这里插入图片描述
在这里插入图片描述

public struct SubArray    {        public int StartIndex;//开始索引        public int EndIndex; //结束索引        public int Sum; //和    }    ///     /// 分治法解决    ///     public static class DivideAndConquer    {       public static SubArray  GetMaxArray(int low, int high, int[] array)        {            if (low==high)            {                SubArray subArray;                subArray.StartIndex = low;                subArray.EndIndex = high;                subArray.Sum = array[low];                return subArray;            }            int mid = (low+high)/2;            SubArray subArray1=GetMaxArray(low,mid,array);            SubArray subArray2=GetMaxArray(mid + 1, high, array);            //低区间最大子数组            int Sum1 = array[mid];            int StartIndex = mid;            int MaxTemp1=0;            for (int i = mid; i >=low; i--)            {                MaxTemp1 += array[i];                if (Sum1
=subArray2.Sum&&subArray1.Sum>=subArray3.Sum) { return subArray1; } else if(subArray2.Sum >= subArray1.Sum && subArray2.Sum >= subArray3.Sum) { return subArray2; } else { return subArray3; } } }
class Program    {        static void Main(string[] args)        {            int[] sum = {-10,55,22,-22};            SubArray subArray=DivideAndConquer.GetMaxArray(0, sum.Length - 1, sum);            Console.WriteLine("最大子数组的和是:{0},索引的起始位置:{1},结束位置:{2}", subArray.Sum, subArray.StartIndex, subArray.EndIndex);            Console.ReadKey();        }    }

转载地址:http://mdrxo.baihongyu.com/

你可能感兴趣的文章
Gson的使用-android
查看>>
我的友情链接
查看>>
HTC推出革新的HTC旗舰级Android智能手机
查看>>
BYOD管理套件VMware的捆绑应用程序
查看>>
java 通过httpClient调用后端逻辑或者下载附件
查看>>
Nagios集成Selenium
查看>>
快速大规模无光驱安装Linux操作系统就选“PXE自动安装”
查看>>
我的友情链接
查看>>
switch&router-四层模式
查看>>
新博安卓培训的第一天
查看>>
游戏中常用到的碰撞检测帮助类
查看>>
访问默认共享
查看>>
01262015要看的blog——oracle tuning
查看>>
[信息图]电子商务营销的6大步骤
查看>>
Webdriver(selenium2.0)+NUnit+C# (一)
查看>>
C语言的基本输入输出
查看>>
Hibernate注释大全收藏
查看>>
通过openfiler模拟存储
查看>>
java学习笔记 --- String类
查看>>
实时检查MySQL数据库延迟状况复制中断数据延迟
查看>>