首页 > 编程语言 > 详细

有关数组中求最大子数组之和的单元测试与效能分析

时间:2021-03-14 00:12:15      阅读:33      评论:0      收藏:0      [点我收藏+]

题目:数组中最大的子数组之和

要求:输入:一个数组和它的大小 ;输出:这个数组中最大子数组的和

例如:

技术分享图片

 

一、程序代码

选用java语言来解决此问题,代码如下:

package 子数组最大和;

import java.util.Scanner;

public class Max {
    
    static int Grial(int a[],int n)
    {
        int sum = -99999999;//这里如果是sum=0,那么后面在数组全为负的情况,b不可能赋值给sum结果就不对,所以sum的初值要赋一个非常小的初值
        int b = 0;
        for (int i = 0; i < n; i++)
        {
            if (b < 0)
                b = a[i];
            else
                b += a[i];
            if (b>sum)
                sum = b;
        }
        return sum;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in=new Scanner(System.in);
        System.out.println("数组个数:");
        int size=in.nextInt();
        System.out.println(size);
        System.out.println("数组:");
        int []a=new int[size];
        for(int i=0;i<size;i++)
        {
            a[i]=in.nextInt();
        }
        
        System.out.println( Grial(a,size));

    }

}

 

二、单元测试

然后就是要开始进行测试了,在Java中我们常用 Junit4 来进行单元测试,它是Java中一套强大的测试框架,并且Junit4在Eclipse里面直接可以测试,简单快捷,所以选择了Junit4来进行单元测试

首先我们要新建一个Junit Test Case:

技术分享图片

然后测试代码如下:

package 子数组最大和;

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;

public class MaxTest {

    Max sum=new Max();
    
    @Before
    public void setUp() throws Exception {
    }

    @Test
    public void testMax1() {
        int []Array=new int[]{-1, 2, 3, -4};
        assertEquals(5, sum.Grial(Array,4));
    }

    @Test
    public void testMax2() {
        int []Array=new int[]{-1, 2, -5, 3, -4};
        assertEquals(3, sum.Grial(Array,5));
    }

    @Test
    public void testMax3() {
        int []Array=new int[]{-1, 20, -5, 30, -4};
        assertEquals(45, sum.Grial(Array,5));
    }


    @Test
    public void testMax4() {
        int []Array=new int[]{0,0,0};
        assertEquals(0, sum.Grial(Array,3));
    }
    
    @Test
    public void testMax5() {
        int []Array=new int[]{-1,-5,-9,-10};
        assertEquals(-1, sum.Grial(Array,4));
    }

    @Test
    public void testMax6() {
        int []Array=new int[]{-1,-5,-9,0};
        assertEquals(0, sum.Grial(Array,4));
    }
}

一共进行了六组测试,如下:

测试编号  测试用例 预期结果 实际结果 测试通过/否 测试期望
1 -1, 2, 3, -4 5 5 通过 最大数组为真子集
2 -1, 2, -5, 3, -4 3 3 通过 最大数组为单一数
3 -1, 20, -5, 30, -4 45 45 通过 最大数组为真子集
4 0,0,0 0 0 通过 数组全为0
5 -1,-5,-9,-10 -1 -1 通过 数组全为负,且最大数组为真子集
6 -1,-5,-9,0 0 0 通过 数组为负和0,且最大数组为0

测试的结果如下:

技术分享图片

三、效能分析

 JProfiler是一个重量级的JVM监控工具,提供对JVM精确监控,其中堆遍历、CPU剖析、线程剖析看成定位当前系统瓶颈的得力工具。可以统计压测过程中JVM的监控数据,定位性能问题。

JProfiler是由ej-technologies GmbH公司开发的一款性能瓶颈分析工具(该公司还开发部署工具)。
其特点:

    • 使用方便
    • 界面操作友好
    • 对被分析的应用影响小
    • CPU,Thread,Memory分析功能尤其强大
    • 支持对jdbc,noSql, jsp, servlet, socket等进行分析
    • 支持多种模式(离线,在线)的分析
    • 跨平台 
  • 实时内存: class/class instance的相关信息。 例如对象的个数,大小,对象创建的方法执行栈,对象创建的热点

技术分享图片

 

  • 堆遍历器: 对一定时间内收集的内存对像信息进行静态分析,功能强大且使用。包含对象的outgoing reference, incoming reference, biggest object等

技术分享图片

 

 

 

 

 

  •  线程: 当前jvm所有线程的运行状态,线程持有锁的状态,可dump线程。

技术分享图片

 

 

  •  Monitors &锁: 所有线程持有锁的情况以及锁的信息

技术分享图片

 

 

 技术分享图片

 

有关数组中求最大子数组之和的单元测试与效能分析

原文:https://www.cnblogs.com/hsybk/p/14530861.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!