博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最大子序列的四种算法
阅读量:5960 次
发布时间:2019-06-19

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

None.gif
package Chapter1;
None.gif
ExpandedBlockStart.gif
public 
class MaxSubSum  {
ExpandedSubBlockStart.gif    
/**
InBlock.gif     * Cubic maximun contiguous susequence sum algorithm.
ExpandedSubBlockEnd.gif     
*/
ExpandedSubBlockStart.gif    
public 
static 
int MaxSubSum1(
int[] a) {
InBlock.gif        
int maxSum = 0;
ExpandedSubBlockStart.gif        
for (
int i = 0; i < a.length; i++) {
ExpandedSubBlockStart.gif            
for (
int j = i; j < a.length; j++) {
InBlock.gif                
int thisSum = 0;
InBlock.gif
InBlock.gif                
for (
int k = i; k <= j; k++)
InBlock.gif                    thisSum += a[k];
InBlock.gif
InBlock.gif                
if (thisSum > maxSum)
InBlock.gif                    maxSum = thisSum;
ExpandedSubBlockEnd.gif            }
ExpandedSubBlockEnd.gif        }
InBlock.gif
InBlock.gif        
return maxSum;
ExpandedSubBlockEnd.gif    }
InBlock.gif
ExpandedSubBlockStart.gif    
/**
InBlock.gif     * Quadratic maximum contiguous subsequence sum algorithm.
ExpandedSubBlockEnd.gif     
*/
ExpandedSubBlockStart.gif    
public 
static 
int maxSubSum2(
int[] a) {
InBlock.gif        
int maxSum = 0;
InBlock.gif
ExpandedSubBlockStart.gif        
for (
int i = 0; i < a.length; i++) {
InBlock.gif            
int thisSum = 0;
ExpandedSubBlockStart.gif            
for (
int j = i; j < a.length; j++) {
InBlock.gif                thisSum += a[j];
InBlock.gif                
if (thisSum > maxSum)
InBlock.gif                    maxSum = thisSum;
ExpandedSubBlockEnd.gif            }
ExpandedSubBlockEnd.gif        }
InBlock.gif        
return maxSum;
ExpandedSubBlockEnd.gif    }
InBlock.gif
ExpandedSubBlockStart.gif    
/**
InBlock.gif     * Resursive maximum contiguous subsequence sum algorithm. Finds maximum sum
InBlock.gif     * in subarray spanning a[leftdot.gifright]. Does not attempt to maintain actual
InBlock.gif     * est sequence.
ExpandedSubBlockEnd.gif     
*/
ExpandedSubBlockStart.gif    
private 
static 
int maxSumRec(
int[] a, 
int left, 
int right) {
InBlock.gif        
if (left == right) 
//
 Base case
InBlock.gif
            
if (a[left] > 0)
InBlock.gif                
return a[left];
InBlock.gif            
else
InBlock.gif                
return 0;
InBlock.gif
InBlock.gif        
int center = (left + right) / 2;
InBlock.gif        
int maxLeftSum = maxSumRec(a, left, center);
InBlock.gif        
int maxRightSum = maxSumRec(a, center + 1, right);
InBlock.gif
InBlock.gif        
int maxLeftBorderSum = 0, leftBorderSum = 0;
ExpandedSubBlockStart.gif        
for (
int i = center; i >= left; i--) {
InBlock.gif            leftBorderSum += a[i];
InBlock.gif            
if (leftBorderSum > maxLeftBorderSum)
InBlock.gif                maxLeftBorderSum = leftBorderSum;
ExpandedSubBlockEnd.gif        }
InBlock.gif
InBlock.gif        
int maxRightBorderSum = 0, rightBorderSum = 0;
ExpandedSubBlockStart.gif        
for (
int i = center + 1; i < right; i++) {
InBlock.gif            leftBorderSum += a[i];
InBlock.gif            
if (rightBorderSum > maxRightBorderSum)
InBlock.gif                maxRightBorderSum = rightBorderSum;
ExpandedSubBlockEnd.gif        }
InBlock.gif
InBlock.gif        
return max3(maxLeftSum, maxRightSum, maxLeftBorderSum
InBlock.gif                + maxRightBorderSum);
ExpandedSubBlockEnd.gif    }
InBlock.gif
ExpandedSubBlockStart.gif    
/**
InBlock.gif     * Return the max of the three number.
InBlock.gif     * 
InBlock.gif     * 
@param
 a
InBlock.gif     *            the first number.
InBlock.gif     * 
@param
 b
InBlock.gif     *            the second number.
InBlock.gif     * 
@param
 c
InBlock.gif     *            the thrid number.
InBlock.gif     * 
@return
 the max of the three number.
ExpandedSubBlockEnd.gif     
*/
ExpandedSubBlockStart.gif    
private 
static 
int max3(
int a, 
int b, 
int c) {
ExpandedSubBlockStart.gif        
if (a > b) {
InBlock.gif            
if (a > c)
InBlock.gif                
return a;
InBlock.gif            
else
InBlock.gif                
return c;
ExpandedSubBlockStart.gif        } 
else {
InBlock.gif            
if (b > c)
InBlock.gif                
return b;
InBlock.gif            
else
InBlock.gif                
return c;
ExpandedSubBlockEnd.gif        }
ExpandedSubBlockEnd.gif    }
InBlock.gif
ExpandedSubBlockStart.gif    
/**
InBlock.gif     * Driver for divide-and-conquer maximum contiguous subsequence sum
InBlock.gif     * algorithm
ExpandedSubBlockEnd.gif     
*/
ExpandedSubBlockStart.gif    
public 
static 
int maxSubSum3(
int[] a) {
InBlock.gif        
return maxSumRec(a, 0, a.length - 1);
ExpandedSubBlockEnd.gif    }
InBlock.gif
ExpandedSubBlockStart.gif    
/**
InBlock.gif     * Linear-time maximum contiguous subsequence sum algorithm.
ExpandedSubBlockEnd.gif     
*/
ExpandedSubBlockStart.gif    
public 
static 
int maxSubSum4(
int[] a) {
InBlock.gif        
int maxSum = 0, thisSum = 0;
InBlock.gif
ExpandedSubBlockStart.gif        
for (
int j = 0; j < a.length; j++) {
InBlock.gif            thisSum += a[j];
InBlock.gif            
if (thisSum > maxSum)
InBlock.gif                maxSum = thisSum;
InBlock.gif            
else 
if (thisSum < 0)
InBlock.gif                thisSum = 0;
ExpandedSubBlockEnd.gif        }
InBlock.gif
InBlock.gif        
return maxSum;
ExpandedSubBlockEnd.gif    }
ExpandedBlockEnd.gif}
None.gif
时间复杂度分别是:O(N
3),O(N
2),O(NlogN),O(N).
本文转自冬冬博客园博客,原文链接:http://www.cnblogs.com/yuandong/archive/2006/08/17/479690.html
,如需转载请自行联系原作者
你可能感兴趣的文章
redux源码分析
查看>>
吴恩达机器学习系列18:核函数
查看>>
Java内存区域和内存模型
查看>>
写python 报错 IndentationError:unindent does not match any outer indentation level
查看>>
iOS 黑魔法 runtime 消息转发 ---附Demo
查看>>
在MySQL中,不要使用“utf8”。使用“utf8mb4”
查看>>
了解 IT 认证价值
查看>>
关于安卓的ViewStub,我有几句话想说。。。
查看>>
Android AOSP基础(一)趁周末用VirtualBox 安装 Ubuntu吧
查看>>
python学习笔记-5.13
查看>>
vuecli3创建项目
查看>>
版本控制工具——Git常用操作(上)
查看>>
5分钟构建无服务图片鉴黄web应用(基于FunctionGraph)
查看>>
神经科学研究所开发AI动作捕捉工具 以高精准度追踪动物动作
查看>>
vue组件之Tabs标签页
查看>>
ES6之变量的解构赋值
查看>>
用localStorage存储购物车数据实战
查看>>
“一带一路”为会展业带来新机遇
查看>>
Spring详解
查看>>
Go defer 知识点
查看>>