`
kitsionchen
  • 浏览: 22661 次
  • 性别: 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. **...

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

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

Global site tag (gtag.js) - Google Analytics