`
kitsionchen
  • 浏览: 23164 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
最近访客 更多访客>>
社区版块
存档分类
最新评论

连续子序列最大和问题(java code)

    博客分类:
  • code
阅读更多
import java.util.Random;
/**
*Maximum continguous subsequence sum algorithm
*连续子序列最大和问题
*/
public class MaxSubSequenceSum
{
    static int seqStart = 0;
    static int seqEnd = -1;
    private static Random rand = new Random( );
   
    /**
    *1.Cubic maximum contiguous subsequence sum algorithm.
    *seqStart and seqEnd respresent the actual best sequence.
    */
    public static int maxSubSum1(int[] a)
    {
        int maxSum = 0;
        for(int i = 0; i < a.length; i++)
            for(int j = i; j < a.length; j++)
            {
                int temp = 0;
                for(int k = i; k <= j; k++)
                    temp += a[k];
                if(temp > maxSum)
                {
                    maxSum = temp;
                    seqStart = i;
                    seqEnd = j;
                }
            }
            return maxSum;
    }

    /**
    *2.Square maximum contiguous subsequence sum algorithm.
    *seqStart and seqEnd represent the actual best sequence
    */
    public static int maxSubSum2(int[] a)
    {
        int maxSum = 0;
        for(int i = 0; i < a.length; i++)
        {
            int temp = 0;
            for(int j = i; j < a.length; j++)
            {
                temp += a[j];
                if(temp > maxSum)
                {
                    maxSum = temp;
                    seqStart = i;
                    seqEnd = j;
                }
            }
        }
        return maxSum;
    }

    /**
    *3.Linear-time maximum contiguous subsequence sum algorithm.
    *seqStart and seqEnd represent the actual best sequence
    */
    public static int maxSubSum3(int[] a)
    {
        int maxSum = 0;
        int temp = 0;
        for(int i = 0, j = 0; j < a.length; j++)
        {
            temp += a[j];
            if(temp > maxSum)
            {
                maxSum = temp;
                seqStart = i;
                seqEnd = j;
            }
            else if(temp < 0)
            {
                i = j+1;
                temp = 0;
            }
        }
        return maxSum;
    }

    /**
    *4.Use divide-and-conquer method maximum contiguous
    *subsequence sum algorithm.
    */
    public static int maxSubSumRec(int[] a, int left, int right)
    {
        int maxLeftBorderSum = 0;
        int maxRightBorderSum = 0;
        int leftBorderSum = 0;
        int rightBorderSum = 0;

        int center = (left+right)/2;

        if(left == right)        //only have a number
            return a[left] > 0 ? a[left] : 0;
       
        int maxLeftSum = maxSubSumRec(a, left, center);
        int maxRightSum = maxSubSumRec(a, center+1, right);

        for(int i = center; i >= left; i--)
        {
            leftBorderSum += a[i];
            if(leftBorderSum > maxLeftBorderSum)
                maxLeftBorderSum = leftBorderSum;
        }

        for(int i = center+1; i <= right; i++)
        {
            rightBorderSum += a[i];
            if(rightBorderSum > maxRightBorderSum)
                maxRightBorderSum = rightBorderSum;
        }

        return ThreeOfMax(maxLeftSum,maxRightSum,
            (maxLeftBorderSum+maxRightBorderSum));
    }

    private static int ThreeOfMax(int a, int b, int c)
    {
        return a>b ? a>c ? a : c : b>c ? b : c;
    }

    public static int maxSubSum4(int[] a)
    {
        return a.length > 0 ? maxSubSumRec(a, 0, a.length-1) : 0;
    }
    public static void getTimingInfo(int n, int algorithm)
    {
        int[] test = new int[n];
        long startTime = System.currentTimeMillis();
        long totalTime = 0;
        int i;
        for(i = 0; totalTime < 4000; i++)
        {
            for(int j = 0; j < test.length; j++)
                test[j] = rand.nextInt(100) - 50;
            switch(algorithm)
            {
                case 1:
                    maxSubSum1(test);
                    break;
                case 2:
                    maxSubSum2(test);
                    break;
                case 3:
                    maxSubSum3(test);
                    break;
                case 4:
                    maxSubSum4(test);
                    break;
            }
            totalTime = System.currentTimeMillis() - startTime;
        }
        System.out.println("Algorithm-->" + algorithm
            + "\tN= " + test.length + "\t"
            + "\tTime= " + (totalTime*1000/i) + " ms");       
    }

    /**Simple test programe*/
    public static void main(String[] args)
    {
        int a[] = {4,-3,5,-2,-1,2,6,-1};
        int maxSum;
        maxSum = maxSubSum1(a);
        print(maxSum);

        maxSum = maxSubSum2(a);
        print(maxSum);

        maxSum = maxSubSum3(a);
        print(maxSum);

        maxSum = maxSubSum4( a );
        System.out.println( "Max sum is " + maxSum );

        for(int n = 10; n <=10000000; n*=10)
       
            for(int algorithm = 4; algorithm >= 1; algorithm--)
            {
                if(algorithm == 1 && n > 50000)
                    continue;
                getTimingInfo(n, algorithm);
            }
    }

    private static void print(int maxSum)
    {
        System.out.println( "Max sum is " + maxSum + "; it goes"
                       + " from " + seqStart + " to " + seqEnd );
    } 
}

Answer:
Algorithm-->4   N= 10           Time= 1 ms
Algorithm-->3   N= 10           Time= 0 ms
Algorithm-->2   N= 10           Time= 1 ms
Algorithm-->1   N= 10           Time= 2 ms
Algorithm-->4   N= 100          Time= 20 ms
Algorithm-->3   N= 100          Time= 8 ms
Algorithm-->2   N= 100          Time= 31 ms
Algorithm-->1   N= 100          Time= 709 ms
Algorithm-->4   N= 1000         Time= 219 ms
Algorithm-->3   N= 1000         Time= 81 ms
Algorithm-->2   N= 1000         Time= 2214 ms
Algorithm-->1   N= 1000         Time= 600428 ms
Algorithm-->4   N= 10000                Time= 2368 ms
Algorithm-->3   N= 10000                Time= 814 ms
Algorithm-->2   N= 10000                Time= 222222 ms
分享到:
评论

相关推荐

    基于java实现动态规划求解最长公共子序列问题

    最长公共子序列(Longest Common Subsequence,LCS)问题是一个经典的计算机科学问题,主要涉及字符串处理和算法设计。在两个或多个字符串中找到最长的序列,该序列不一定是连续的,但存在于每个字符串中,这就是LCS...

    格雷码(Gray Code)序列

    首先,我们有一个一比特的格雷码序列,它只有两个元素:0和1。要生成两位的格雷码序列,我们可以按照以下步骤操作: 1. **原始序列**:对于一比特的格雷码,序列是 [0, 1]。 2. **添加前缀0**:在原始序列的每个...

    HaffmanCode.rar_huffman_huffman编码java

    通过理解以上概念和流程,我们可以编写Java程序来实现哈夫曼编码,并用`HaffmanCode.txt`文件作为输入或输出,进行数据的压缩和解压。这种编码方法广泛应用于数据传输、文件存储等领域,以节省存储空间和提高传输...

    JAVA上百实例源码以及开源项目源代码

    密钥 Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存...

    算法:JAVA_test_code

    例如,你可能会遇到像“两数之和”这样的简单问题,它可以通过哈希表在O(n)时间内解决,或者像“最长连续序列”这样的问题,它涉及到了数组操作和哈希表的应用。 在"Algorithm-master"这个压缩包中,我们可以预期...

    Online-Judges-Problems-SourceCode:我针对各种在线法官的不同ACM风格问题的解决方案。 解决方案使用C ++,C,Java和Python编写

    8. **在线算法**:这类算法在内存有限且数据输入逐步到来的情况下尤其有用,如Kadane's Algorithm用于找到数组中的最大连续子数组和。 9. **竞赛编程平台特性**:每个平台有自己的提交和评测规则,如时间限制、内存...

    最长配对(51Nod-2494).rar

    这个问题通常采用动态规划的方法来解决,创建一个二维数组来存储前缀子序列的长度,从而找到最长公共子序列。 2. **最长公共子串**:与子序列不同,最长公共子串要求连续的字符在两个字符串中同时出现。例如,...

    random-codebits:尝试在javanode.js中实现基本或不基本的算法,数据结构和其他内容

    - 动态规划:用于解决具有重叠子问题和最优子结构的问题,如背包问题、最长公共子序列等。 - 回溯法:在搜索树中寻找解的过程,如八皇后问题、图的深度优先搜索等。 - 图论算法:如Dijkstra最短路径算法、Floyd-...

    Code-DataStructuresandAlgorithms:练习数据结构和算法

    - **动态规划**:解决具有重叠子问题和最优子结构的问题,如背包问题、最长公共子序列等。 - **回溯法**:用于解决组合优化问题,如八皇后问题、N皇后问题。 - **贪心算法**:局部最优解导向全局最优解,如Prim...

    fundation-code:一些OJ的代码和基础的数据结构及算法

    3. 动态规划:通过状态转移方程解决最优化问题,如背包问题、最长公共子序列等。 4. 图算法:Dijkstra算法、Floyd-Warshall算法用于求解最短路径,Kruskal和Prim算法用于最小生成树。 5. 分治策略:将大问题分解为小...

    leetcode答案-leet-code:我在https://leetcode.com/problemset/algorithms/上对Lee

    3. **动态规划**:一种通过将大问题分解为子问题来求解的方法,适用于背包问题、最长公共子序列、斐波那契数列等。 4. **回溯法**:当面临多条可能路径时,通过撤销先前的选择来尝试其他路径,常用于解决组合问题和...

    PCM 转 WAV 格式

    PCM(Pulse Code Modulation,脉冲编码调制)是一种模拟信号数字化的过程,它将连续的音频信号转换成离散的数字序列。WAV(Waveform Audio Format)是微软开发的一种无损音频文件格式,广泛用于存储和交换音频数据。...

    javalruleetcode-Leetcode:我的leetcode算法问题代码

    递增子序列[ 蛮力] 488 祖玛游戏[ BFS ] 487 最大连续一个- II 空间解决方案O(1) ] 486预测胜利者[DP+博弈论| 更短的代码] 485 最大连续一个 [ 蛮力 ] 484 查找排列 [ 拓扑排序 | 建设性方法] 483 最小的好基 [ 蛮力...

    安全客 2019Q2.pdf

    - CARTA-Inspired Vulnerability Management:符合CARTA方法论的弱点管理,即连续风险和信任评估方法,允许企业更好地理解风险和做出相应的决策。 - Detection and Response:检测与响应,指及时发现安全事件并...

    数据结构-advanced data structure (peter brass)

    - **区间受限最大和查询的树(4.4 Trees for Interval-Restricted Maximum Sum Queries)**:解决了在给定区间内寻找具有最大和的连续子区间的查询问题。 - **正交范围树(4.5 Orthogonal Range Trees)**:处理多维...

    android-touchexample:自动从code.google.compandroid-touchexample导出

    这个项目是用Java编程语言编写的,可以从code.google.com/p/android-touchexample获取,但现在可能已经迁移到了其他代码托管平台,因为Google Code已不再支持新的项目。本文将深入探讨Android中的触摸事件处理及其...

    计算机科学与技术专业英语.pdf

    7. **动画(animations)**:计算机生成的连续图像序列,产生动态视觉效果,常见于游戏和多媒体应用。 8. **小程序(applets)**:小型应用程序,通常嵌入在网页中,为用户提供交互功能,如Java applets。 9. **...

    正则表达式介绍

    正则表达式不仅限于匹配单个字符,还可以通过重复和量词来匹配连续的字符序列。 ##### 1. 匹配一个或多个字符 `+`符号表示前面的字符或组至少出现一次。例如,`a+`将匹配所有包含一个或多个`a`字符的字符串。 ###...

    正则表达式

    当一个正则表达式成功地和目标字符串相匹配时,可以从目标串中抽出和括号中的子模式相匹配 的部分.例如,假定我们正在检索的模式是一个或多个字母后面跟随一位或多位数字,那么我们可以使用模式 / [a-z] + \ d+/.但是...

    计算机等级考试四级考试中英文术语对照.pdf

    5. **模拟计算机(Analog Computer)**:处理模拟信号而非数字信号的计算机,常用于解决连续性问题。 6. **汇编程序(Assembler)**:将人类可读的汇编语言转换为机器可执行的二进制代码的程序。 7. **自动化....

Global site tag (gtag.js) - Google Analytics