什么是算法?
官方解释:
- 算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法解决问题的策略机制。
- 也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。
算法 + 数据结构 = 程序设计
“Algorithms + Data Structures = Programs”(出自:Pascal之父Nicklaus Wirth)
- 算法是为了解决实际问题而设计的,
- 数据结构是算法需要处理的问题载体。
概述:
- 程序能否快速而高效地完成预定的任务,取决于是否选对了数据结构,而程序是否能清楚而正确地把问题解决,则取决于算法。算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务。
算法目标:
在程序中,我们也可以用不同的算法解决相同的问题,而不同的算法的成本也是不相同的。总体上,一个优秀的算法追求以下两个目标:
- 花最少的时间完成需求;
- 占用最少的内存空间完成需求;
案例
需求1:计算1到100的和。
- 第一种解法:
@Testpublicvoidtest01(){intsum=0;intn=100;for(inti=1;i<=n;i++){sum+=i;}System.out.println("sum="+sum);}- 第二种解法:
@Testpublicvoidtest01(){intsum=0;intn=100;sum=(n+1)*n/2;System.out.println("sum="+sum);}解析:
很明显,第二种算法完成需求,花费的时间更少一些。
需求2:计算10的阶乘
- 第一种解法:递归
@Testpublicvoidtest01(){//测试,计算10的阶乘longresult=fun1(10);System.out.println(result);}//计算n的阶乘publicstaticlongfun1(longn){if(n==1){return1;}returnn*fun1(n-1);}- 第二种解法:for循环
@Testpublicvoidtest02(){//测试,计算10的阶乘longresult=fun2(10);System.out.println(result);}//计算n的阶乘publicstaticlongfun2(longn){intresult=1;for(longi=1;i<=n;i++){result*=i;}returnresult;}解析:
第一种解法:
- 使用递归完成需求,fun1方法会执行10次,并且第一次执行未完毕,调用第二次执行,第二次执行未完毕,调用第三次执行…最终,最多的时候,需要在栈内存同时开辟10块内存分别执行10个fun1方法
第二种解法:
- 使用for循环完成需求,fun2方法只会执行一次,最终,只需要在栈内存开辟一块内存执行fun2方法 即可。
很明显,第二种算法完成需求,占用的内存空间更小。
递归通常消耗内存高,因为操作方法需要开辟更多空间