算法的概念, 比如, 在这里边存着一堆数据,算法就是按照一定的条件,从这已经存在的数据里边进行计算,得到目标或者期望要得到的结果,这就是算法.
程序呢其实呢,就是对现实世界的一个模拟,程序是用来解决现实生活中的问题的.
在生活中遇到任何一个问题,其实都可以多种解决方案,而不同解决法带来的成本是不相同的,那么现在要用算法或者要用程序来解决现实生活中的问题.
那么同理,使用的算法也可以有不同, 或者叫解决方案也可以有不同.
但是呢,总体上一个优秀的算法,需要追求这么两个目标,第一个花最少的时间完成需求,第二个占用最少的内存空间完成需求.
需要用最少的时间来完成计算.
占用最少的内存空间完成需求, 是因为服务器对内存空间是要求的,比方说有一台服务器,那么它随着用户量的增长,服务器这个内存空间其实还是有瓶颈的,如果说算法能够占用的内存空间更小的话,带来的好处就是对硬件成本就可以降低.
在研究算法的时候,重点就需要从时间角度和内存角度来进行分析这个算法.
通过两个案例分析一下,花最少的时间和占最少的内存空间.
第一个需求是计算1到100的和.
给出两种解法,第一个解法定义了两个变量,sum =0,n=100,然后做了一个for循环,得到1到100之间的每一个数字叠加到求和变量上,最后把和输出,这是第一种解法.
第二种解法,定义两个变量,同样是sum =0,n=100,但是求和不是通过for循环,而是通过高斯公式来完成,sum =(n+1)×n÷2,最后把和变量输出去.
现在分析一下这两个算法的占用时间.
第一个它的算法,定义两个变量,要做100次循环,做100次加法运算, 最后输出结果.
而第二个也定义了两个变量,但是做求和运算时候,做了一次加法,做了一次乘法,做了一次除法, 总共做了三次运算.
而上边是做了100次运算,然后最后把这个和输出出去.
很明显,3次运算要比100次运算花费时间要少, 因此第二种算法就是要追求的算法.
它会占用更少的时间去完成相同的需求,这是第一个案例.
第二个案例,有一个需求, 是计算10的阶乘.
给出了两种解法.
第一种解法,fun1这个解法,需要参数n ,在这里面是通过递归可以完成,那么如果n==1,那么阶乘就是1,等于1×1,就是1.
如果不是1,计算方式就是就是n的阶乘等于nⅹ(n-1)的阶乘.
那n-1的阶乘可以通过递归调用 fun1 , 就可以得出n-1的阶乘,这是第一种算法.
第二种算法,定义了一个记录阶乘的变量result ,在里边,做了一个for 循环,那么for 循环里边得到1到n之间的每一个值,然后累积, 乘到阶乘变量result 上,最终返回结果.
分析一下这两种解法对内存的一个占用.
第一种是通过递归来完成的,如果要求10的阶乘的话,很明显, 这个方法会执行十次. 而每一次方法的调用,其实都会在栈内存里边开辟一块内存,来执行这个方法,那么要调用十次这样的方法,就会占用十块内存来执行这10个方法.
而第二种解法,调用了一次fun2方法,因此在栈内存里边, 只需要开辟一块内存来执行fun 2这个方法即可.
因此,很明显, 第二种算法占用的内存, 是要比第一种算法占用内存是要小的,所以第二种这种解法才是算法要追求的.因为它所占用的内存空间更小.