算法的效率作者:何杭广????文章来源:本站原创????点击数:2097????更新时间:2005-12-12
评价一个算法的效率主要是考察算法执行时间的情况。可以在相同的规模下,根据执行时间的长短来评价一个算法的优劣。一个算法的好坏对计算机的效能影响有多大呢?我们来做这样一个比较,假设有两台计算机分别是计算机A和计算机B,计算机A的运算处理速度比计算机B大约快50倍。以求解“百钱买百鸡”(“鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一。百钱买百鸡。问鸡翁、母、雏各几何?”)为例子,设鸡翁为x只,鸡母为y只,鸡雏为z只。算法A:把公鸡、母鸡、小鸡的枚举范围都是1~100;算法B:经粗略计算公鸡的枚举范围为1~20,母鸡的枚举范围为1~33,而小鸡的枚举范围应是100-x-y。在计算机A上运行算法A程序,在计算机B上运行算法B程序,两台计算机谁先把结果运算出来呢?
算法A的程序代码如下:
For x = 1 To 100
For y = 1 To 100
For z = 1 To 100
If (x+y+z=100) And (5* x + 3 * y + z/3 = 100) Then
List1.AddItem Str(x) + " " + Str(y) + " " + Str(z)
End If
Next z
Next y
Next x
算法B程序代码如下:
For x = 1 To 20
For y = 1 To 33
Z=100-x-y
If 5* x +3* y + z/3 = 100 Then
List1.AddItem Str(x) + " " + Str(y) + " " + Str(z)
End If
Next y
Next x
运算结果是计算机B先把结果运算出来。为什么会这样呢?我们来分析一下,算法A需要执行100×100×100=1000000次内循环,而算法B只需要执行20×33=660次内循环,虽然计算机A比计算机B快50多倍,但还是计算机B先求得计算结果。
一个好的算法可以算得更快。什么样的算法是好算法呢?通常从时间复杂度和空间复杂度两方面来评价,在这里我们主要讨论时间复杂度。通常我们把算法的基本操作执行的次数作为算法的时间量度T(n)=O(f(n)),表示随着规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称时间复杂度,估算时按该算法对各种输入情况的平均值来考虑。在最坏情况下的复杂度和平均情况下的复杂度是评估算法两种衡量标准。
在排序算法中,我们学习了冒泡排序和交换排序,这两种算法的效率如何呢?下面我们来进行讨论。算法的基本操作主要是比较语句和交换两个变量值的赋值语句。冒泡排序(bubble sort)是在一列数据中把较小的数据逐次向上推移的一种技术,它和气泡从水中往上冒的情况有些类似,它把待排序的n个元素的数组看成是垂直堆放的一列数据,从最下面的一个元素起,自下而上地比较相邻两个元素中的数据,将较小的数据换到上面的一个元素中。当第一遍加工完成时,最小的数据已经上升为第一个元素的数据。然后对余下的n-1个元素重复上述处理过程,直至最后进行余下两个数据的比较和交换。
在冒泡排序实现过程中,一般地,对于数组d(1)、d(2)、d(3)、…、d(n)
第1遍,比较d(j)、d(j-1),j=n,n-1,…4,3,2,需要比较关键字n-1次;
第2遍,比较d(j)、d(j-1),j=n,n-1,…4,3,需要比较关键字n-2次;
……
第n-1遍:比较d(j)、d(j-1) ,j=n,需要比较关键字1次。
所以共需比较关键字(n-1)+(n-2)+ …+1=n(n-1)/2次。在最好情况下移动次数为0次(原数列已经按从小到大排好序),在最坏情况下移动次数为3n(n-1)/2次(原数列是按从大到小排列的,而输出是从小到大排序,每次比较都要交换数据,每次交换数据都要执行三条赋值语句,故为3倍的比较次数)。最坏情况是例如原数列是5,4,3,2,1,现要求从小到大排序。冒泡排序程序执行过程数组数据变化如下:
第1遍:[5 4 3 2 1]、[5 4 3 1 2]、[5 4 1 3 2]、[5 1 4 3 2 ]、[1 5 4 3 2],移动4*3次;
第2遍:[1 5