什么是算法?为什么要研究算法?

随着互联网的发展,虽然计算机的计算能力每年都在飞快增长,价格也在不断下降。但是我们需要处理的信息量更是呈指数级的增长。对于相同的需求,相同的数据基础,不同的算法,所消耗的时间和计算机空间是不一样的,当然消耗时间越短,空间越小的代码越优秀,下面我们来看一个简单需求(求和1-100 000 0000)的代码实现。

    /**
     * 方式一:求和1-100 000 0000
     */
    @Test
    public void getSum1()  {
        Runtime r = Runtime.getRuntime();
        r.gc();
        long startMem = r.freeMemory();
        long startTime = System.currentTimeMillis();
        long result = 0;
        for (long i = 1; i <= 1000000000L; i=i+1L) {
            result+=i;
        }
        long endTime = System.currentTimeMillis();
        long endMem = r.freeMemory();

        System.out.println("方式一:求和1-1000000000的结果为"+result+",耗时"+(endTime-startTime)+"毫秒"+",消耗内存"+(startMem-endMem)+"字节");
    }

运算结果:
方式一:求和1-1000000000的结果为500000000500000000,耗时471毫秒,消耗内存21453824字节

    /**
     * 方式二:求和1-1-100 000 0000
     * 解:设
     * x=1+2+..+(n-1)+n
     * y=n+(n-1)+...+2+1
     * 所以:
     * x+y=(1+n)+(2+n-1)+...+(n-1+2)+(n+1)
     * 2x=(n+1)+(n+1)+...+(n+1)+(n+1)
     * 2x=n(n+1)
     * x=n(n+1)/2
     */
    @Test
    public void getSum2()  {
        Runtime r = Runtime.getRuntime();
        r.gc();
        long startMem = r.freeMemory();
        long start = System.currentTimeMillis();
        long i=1000000000;
        long result = (i*(i+1))/2;
        long end = System.currentTimeMillis();
        long endMem = r.freeMemory();
        System.out.println("方式二:求和1-1000000000的结果为"+result+",耗时"+(end-start)+"毫秒"+",消耗内存"+(startMem-endMem)+"字节");
    }

运算结果:
方式二:求和1-1000000000的结果为500000000500000000,耗时0毫秒,消耗内存0字节

通过对两种方式运行结果的观察,同样是求解1-100亿的和,两段代码所消耗的运行时间却有很大的差别,显然方式二更好些


版权声明:本文为lazy_cat_go原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。