本文使用分治思想求解一个整型数组中的最大子序列,该算法的时间复杂度为NlogN,使用千万级的数据量计算结果的时间不超过0.5s。该算法使用了分治的思想:求解最大子序列的问题可以理解为将整个数组分成左右两部分,分别求解左边和 右边的最大子序列,并且还有一种情况是最大子序列在中间,此时可以可以直接从中间开始分别向左和向右遍历求解左右两边的最大子序列(由于此时假定最大子序列在中间,因而中间的元素肯定在最大子序列中),然后将两边的最大子序列相加就会得到最大子序列在中间时的子序列,此时当前数组就会有三个(左边,右边和中间)已经求得的最大子序列,现只需要比较这三个子序列的和即可,将最大和返回。具体的算法如下:

public class Solution {public long findMaxSubSequence(Integer[] arr) { //return maxSumRec(arr, 0, arr.length - 1);}// 求解最大子序列函数private long maxSumRec(Integer[] arr, int left, int right) {// 递归调用的出口if (left == right) {return arr[left];}// 分别计算左边和右边的最大子序列int center = (left + right) / 2;long maxLeftSum = maxSumRec(arr, left, center);long maxRightSum = maxSumRec(arr, center + 1, right);// 计算中间的最大子序列的左半部分的最大值int maxLeftBorderSum = 0, leftBorderSum = 0;for (int i = center; i >= left; i--) {leftBorderSum += arr[i];if (leftBorderSum > maxLeftBorderSum) {maxLeftBorderSum = leftBorderSum;}}// 计算中间的最大子序列的右半部分的最大值int maxRightBorderSum = 0, rightBorderSum = 0;for (int i = center + 1; i <= right; i++) {rightBorderSum += arr[i];if (rightBorderSum > maxRightBorderSum) {maxRightBorderSum = rightBorderSum;}}return max(maxLeftSum, maxRightSum, maxLeftBorderSum + maxRightBorderSum);}// 求解三个值中的最大值private long max(long maxLeftSum, long maxRightSum, int maxBorderSum) {return maxLeftSum >= maxRightSum && maxLeftSum >= maxBorderSum ? maxLeftSum : (maxRightSum > maxBorderSum ? maxRightSum : maxBorderSum);}
}

具体的实验程序如下:

import java.util.Date;
import java.util.Random;public class App {public static void main(String[] args) {Integer[] arr = new Integer[10000000];for (int i = 0; i < 10000000; i++) {arr[i] = new Random().nextInt();}Solution solution = new Solution();Long start = new Date().getTime();long result = solution.findMaxSubSequence(arr);Long end = new Date().getTime();System.out.println("结果为:" + result);System.out.print("所用时长为:" + (end - start));}
}

运行结果如下:

计算结果为:2147483164
所用时长为:447
Process finished with exit code 0

这是计算最大子序列的一种算法,现贴出一种更为完美的方法,其时间复杂度为O(N),代码量也得到了大大的简化,代码如下:

public class Solution {public long findMaxSubSequence(Integer[] arr) {long maxSum = 0, thisSum = 0;for (int i = 0; i < arr.length; i++) {thisSum += arr[i];if (thisSum > maxSum) {maxSum = thisSum;} else if (thisSum < 0){thisSum = 0;}}return maxSum;}
}

由于本人也不甚理解,现只将代码帖于此处。

转载于:https://www.cnblogs.com/zhangxufeng/p/8284067.html

使用分治思想求解最大子序列相关推荐

  1. 本文专注于lt;递归算法和分治思想[胖虎学习算法系列]

    本文专注于<递归算法和分治思想> 初衷:博主看到网上有很多人贴出各种OJ上的AC代码,很多都会标注上"递归"两字 我刚开始学习递归算法和分治法的时候,苦于没有人写出递归 ...

  2. 【算法】学习笔记(4):分治思想 归并排序

    分治思想,分治策略,自古有之,与人类生活息息相关,其本质是将大问题拆解为小问题,小问题转换为已知解的问题,进而求解. 军队管理,国家分级治理-- 大规模数据排序,例如10000000000万个数,规模 ...

  3. 用递归与分治策略求解网球循环赛日程表_算法设计:分治法(比赛日程安排)...

    一.算法思路 1.思路 分治算法的思想是:对于一个规模位N的问题,若该问题可以容易解决(比如规模N较小),则直接解决,否则将其分解为M个规模较小的子问题,这些子问题互相独立,并且与原问题形式相同,递归 ...

  4. 算法设计与分析:分治思想 - 入门

    文章目录 分治思想 判断分治的条件 分治思想在排序问题的应用 求逆序对的个数 分治总结 本文参考UCAS卜东波老师的计算机算法设计与分析课程完成 分治思想 分治思想可以归纳为两点: 将一个复杂问题化简 ...

  5. 分治思想应用:数学归纳法、递归、归并排序、MapReduce

    跟黄申老师学数学系列02(python实现) 引言: 数学归纳法(Mathematical Induction).递归.归并排序(merge sort).MapReduce,这些方法或技术都基于一个重 ...

  6. 线性时间选择算法的分治思想:邮局选址问题和士兵战队问题

    一. 实验题目 1. 邮局选址问题 在一个按照东西和南北方向划分成规整街区的城市里,n 个居民点散乱地分 布在不同的街区中.用 x 坐标表示东西向,用 y 坐标表示南北向.各居民点的 位置可以由坐标( ...

  7. 【PTA】7-2 国王的奖励——分数取模、分治思想、快速幂、int64的乘法模运算【C/C++】

    文章目录 1 问题 1.1 题面描述 1.2 输入描述 1.3 输出描述 1.4 样例描述 1.5 样例解释 2 分析 2.1 数学抽象 2.2 解决方法 2.2.1 等比求和 2.2.1.1 求和公 ...

  8. 【算法】归并排序:自底向上、自顶向下(分治思想)的实现

    [算法]归并排序:自底向上.自顶向下(分治思想)的实现 1 自底向上 算法 import java.util.Arrays;/*** 归并排序:自底向上*/ public class Sort {/* ...

  9. 用递归与分治策略求解网球循环赛日程表_分治、动态规划、回溯、贪心一锅炖

    「观感度:五颗星」 「口味:东北一锅出」 「烹饪时间:10min」 本文已收录在 Github github.com/Geekhyt,感谢Star. 数据结构与算法系列专栏第四弹来袭,往期专栏链接如下 ...

最新文章

  1. MySQL:从B树到B+树到索引再到存储引擎
  2. 符号未定义Java_Java ODBC数据源(未定义符号:SQLAllocEnv)
  3. 我理解中的“大前端”/“大无线”
  4. 4)机器学习基石笔记 Lecture4:Feasibility of Learning
  5. 一只猫引发的互联网争论
  6. 没钱没资本可以创业不,想创业的人怎么办
  7. decimal转换为int_FPGA基础知识极简教程(10)二进制到BCD转换算法
  8. 知名互联网公司系统架构图[第3期]
  9. 【Turbo】基于MATLAB的turbo编译码算法的仿真
  10. Spring之FactoryBean的使用与源码解析
  11. 5面阿里,终获offer(Java后端)
  12. lic文件用计算机程序打开,后缀名是lic的文件用什么软件打开?
  13. 开源 java CMS - FreeCMS2.8 移动app站点配置
  14. excel条形图-蝴蝶图的画法
  15. 遥感影像语义分割数据集
  16. Python操作Excel自动插入图片
  17. PVsyst光伏组件辐照度算法
  18. 计算机图形学专业术语
  19. makefile传字符串给c语言,makefile终极奥义
  20. vim几个小技巧(批量替换,列编辑)

热门文章

  1. Ubuntu10.04下Linux内核编译的完整步骤
  2. 在字符串中找出第一个只出现一次的字符,Python实现
  3. Python基础6—常用语句
  4. 水溶彩铅的特点技法运用
  5. GRE Tunnel实现企业网中的***
  6. Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析(7)
  7. unsigned int数相减时候的trick
  8. python---图表的使用
  9. 1045. Favorite Color Stripe (30)
  10. sqlserver中分区函数 partition by的用法