学习知识,有的人学的快、学的轻松、应用的好;有的人学的慢、学的吃力,应用差。 这是为什么? 传统的观
点认为,前者脑子好使,聪明,是学习的料儿,后者就是不行。 我本人不赞同这种观点,我觉得学习好或者不好是
和方法有关系的,学习方法得当了,就能达到前者的水平。只要是有正常能力的人都可以做到。 方法的好坏怎么衡
量,怎么评定呢? 看看效果心里就有数了。
在计算机里,需要处理数据,处理数据过程中需要用到一些算法来运算、整理数据。 计算机的脑子是很好使
的,不用怀疑。计算机处理同样的数据,可以使用多个算法处理。 这些算法在处理速度,效率等方面也是有区别
的,怎么评价算法呢? 下面大致分了四个方面来评价算法。
正确性
能正确地实现预定的功能,满足具体问题的需要。 处理数据使用的算法是否得当,能不能得到预想的结果。
易读性
易于阅读、理解和交流,便于调试、修改和扩充。 写出的算法,能不能让别人看明白,能不能让别人明白算法的
逻辑? 如果通俗易懂,在系统调试和修改或者功能扩充的时候,使系统维护更为便捷。
健壮性
输入非法数据,算法也能适当地做出反应后进行处理,不会产生预料不到的运行结果。 数据的形式多种多样,算
法可能面临着接受各种各样的数据,当算法接收到不适合算法处理的数据,算法本身该如何处理呢? 如果算法能够
处理异常数据,处理能力越强,健壮性越好。
时空性
算法的时空性是该算法的时间性能和空间性能。 主要是说算法在执行过程中的时间长短和空间占用多少问题。
算法处理数据过程中,不同的算法耗费的时间和内存空间是不同的。
【例】求1!+2!+3!+…+n! ,用两种算法求解如下(C语言):
1、一重循环算法
<span style="font-family:KaiTi_GB2312;font-size:18px;"> int function1(int n) { int i,j,temp,s; s=0; for(i=1,i<=n;i++) { temp=1; for(j=1;j<=i;j++) temp=temp*j; s=s+temp; } return s; }</span>
2、二重循环算法
<span style="font-family:KaiTi_GB2312;font-size:18px;"> int function2(int n) { int i,temp,s; s=0; temp=1; for(i=1;i<=n;i++) { temp=temp*i; s=s+temp; } return s; }</span>
3、对比
function1共两层循环,内循环先算出i!,然后外循环从1到n, function2只有一层循环,求解i! 时,借助已经
算出的(i-1)!;同时function2省去了变量j,减少了较多赋值的操作,节省了运算的时间。
4、时间复杂度
本算法中涉及到了几个基本的操作,加法、乘法、赋值。 在这两种算法中,当n=5时,统计了一下算法使用基本
操作的个数。
function1的基本操作用到的次数总和 T1(n)=n^2+4n+1,当n足够大的时候,T(n)和n^2成正比,这时用O(n^2)表示时
间复杂度。function2的时间复杂度时O(n). 阶数低于平方阶的算法是高效的算法。 所以function2的是较好的算
法。
【例】读入n=100个整数到一个数组,使用算法将数组中的数逆置。
1、从数组两端依次将对应的数交换
<span style="font-size:18px;"> <span style="font-family:KaiTi_GB2312;">void function3(int a[],int n) { int i,temp; for(i=0;i<=n/2-1;i++) { temp=a[i]; a[i]=a[n-1-i]; a[n-1-i]=temp; } } </span></span>
2、数组a先逆置到数组b,然后将b复制到a
<span style="font-family:KaiTi_GB2312;font-size:18px;">void function4(int a[],int n) { int i,b[100]; for(i=0;i<=n-1;i++) b[i]=a[n-1-i]; for(i=0;i<=n-1;i++) a[i]=b[i]; }</span>
算法执行期间需要耗费存储空间,这些存储空间主要被三个部分占用,分别是程序代码、输入数据、辅助变
量。 其中辅助变量占用的控件较多。 在上面的两个算法中,function4执行过程中,需要内存再分配一些空间。
3、空间复杂度
算法在运行过程中临时占用存储空间大小的量度。 算法执行期间需要耗费存储空间主要被三个部分占用,分别是
程序代码、输入数据、辅助变量。 其中辅助变量占用的空间较多。 在上面的两个算法中,function4执行过程中,
需要内存再分配一些空间。 表示方式和时间复杂度相似,用符号O表示。
了解这些内容,在设计程序的时候,我们可以依据这些知识来判断算法的好坏,择优选择算法。 这些知识一
些参考方法,有些情况下,不符合这些标准也不一定不是好算法,如果空间允许,算法在执行过程中多利用一些空间
可以节省时间的话,可以选择用空间换取时间。反之如果空间不太充足,可以选择运算时间长,但节省空间的算法。
具体问题视情况而定。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/wangju2013/article/details/48106805