java数据结构-----两种简单算法的运行效率比较

一个优秀的算法可以节省计算机宝贵的计算资源,优化程序结构,提高使用者体验,更好的解决问题。
我们都知道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到100的累加结果比较
可以看到,两种算法的运行时间均小余1毫秒,那么我们来加大一下运算量。
运算1到10000的累加结果比较
可以看到,两种算法的运行时间依然均小余1毫秒,那么我们来继续加大运算量。
这里要注意,由于int整型的上限是2147483647,所以继续用int很有可能溢出,所以我们把sum的类型改为long

运算1到30000的累加结果比较
可以看到,从1累加到3万,运行时间久有了差异,普通算法运算了2毫秒,高斯算法运算时间依然小余1毫秒。
运算1到30000的累加结果比较
从1累加到5万,普通算法运算了2毫秒,高斯算法运算时间依然小余1毫秒。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值