一个优秀的算法可以节省计算机宝贵的计算资源,优化程序结构,提高使用者体验,更好的解决问题。
我们都知道1加到100这个经典的问题,如果用程序表示就是
int sum = 0;
for (int t = 0; t <= 100; t++) {
sum = sum + t;
}
这种算法基本上学过一点高级语言的同学应该都能写出来吧
然而有没有更简单高效的方法呢?
高斯小时候非常淘气,一次数学课上,老师为了让他们安静下来,给他们列了一道很难的算式,让他们一个小时内算出1+2+3+4+5+6+……+100的得数。全班只有高斯用了不到20分钟给出了答案,因为他想到了用(1+100)+(2+99)+(3+98)……+(50+51)……一共有50个101,所以50×101就是1加到一百的得数。后来人们把这种简便算法称作高斯算法。
具体的方法是:首项加末项乘以项数除以2
项数的计算方法是末项减去首项除以项差(每项之间的差)加1.
如:1+2+3+4+5+······+n,则用字母表示为:n(1+n)/2
等差数列求和公式 Sn=(a1+an)n/2 Sn=n(2a1+(n-1)d)/2; d=公差 Sn=An2+Bn; A=d/2,B=a1-(d/2)
我们今天就来探讨一下这两种算法,效率到底相差多少。
以下代码运行环境基于jdk1.8,eclipse Oxygen.2
累加算法:
System.out.println("请输入累加的n值");
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
Date date1 = new Date();
int sum = 0;
for (int t = 0; t <= i; t++) {
sum = sum + t;
}
System.out.println("方法1的计算结果是:" + sum);
Date date2 = new Date(); // 获得当前时间
System.out.print("本方法运行时间:");
System.out.println(date2.getTime() - date1.getTime());//当前时间减去算法开始运行的时间,得到算法执行时间,单位毫秒
}
高斯算法:
System.out.println("请输入累加的n值");
Scanner sc1 = new Scanner(System.in);
int i = sc1.nextInt();
Date date3 = new Date();
int sum = 0;
sum = (1+i)*i/2;
System.out.println("方法2的计算结果是:" + sum);
Date date4 = new Date(); // 获得当前时间
System.out.print("本方法运行时间:");
System.out.println(date4.getTime() - date3.getTime());
}
这里我接收了用户输入值来进行计算,因为100次的累加根本无法看出算法差距,他们的运行时间都小余1毫秒。
累加100次的结果如下:
可以看到,两种算法的运行时间均小余1毫秒,那么我们来加大一下运算量。
可以看到,两种算法的运行时间依然均小余1毫秒,那么我们来继续加大运算量。
这里要注意,由于int整型的上限是2147483647,所以继续用int很有可能溢出,所以我们把sum的类型改为long
可以看到,从1累加到3万,运行时间久有了差异,普通算法运算了2毫秒,高斯算法运算时间依然小余1毫秒。
从1累加到5万,普通算法运算了2毫秒,高斯算法运算时间依然小余1毫秒。