著名的计算机科学家图灵奖获得者N.Wirth(沃思)教授给出了一个著名的公式:算法+数据结构=程序,这说明数据结构和算法是程序的两大要素,二者相辅相成,缺一不可。
数据结构和算法之间存在着本质联系,在某一数据类型上,总要设计其上施加的运算,而只有通过对定义运算的研究,才能清楚地理解数据结构的定义和作用;在涉及运算问题时,总要与该算法所处理的对象和结果根据等联系起来进行考虑。
在本门课程中将大量的解决算法问题,因为算法联系着数据在计算过程中的组织形式,为了描述实现某种操作,常常需要设计算法,因而算法是研究数据结构的重要途径。
1.算法定义
算法(Algorithm)是规则的有限集合,是为解决特定问题而规定的一系列操作。
2.算法的特性
(1)有限性:有限步骤之内正常结束,不能形成无限循环。
(2)确定性:算法中的每一个步骤必须有确定含义,无二义性。
(3)可能性:原则上能精确进行,操作可通过已实现的基本运算执行有限次而完成。
(4)输入:有多个或0个输入
(5)输出:至少有一个或多个输出。
在算法的五大特性中,最基本的是有限性、确定性和可行性这三个特性。
3.算法设计的要求
当用算法来解决某问题时,算法设计的目标是正确、可读、健壮、高效、低耗。通常作为一个好的算法,一般应该具有以下几个基本特征。
(1)算法的正确性
算法的正确性是指算法应该满足具体问题的求解需求。其中“正确”的含义大体上可以分为以下三个层次:
1.算法对于几组输入数据能够得出满足要求的结果。
2.算法对于精心选择的典型、苛刻而带有刁难性的输入数据能够得出满足要求的结构。
3.算法对于一切合法的输入数据都能产生满足要求的结果。
达到三层含义下的正确是极为困难的,一般情况下,至少应以第二层含义的正确作为衡量一个算法是否正确的标准。
例1. 求n个数的最大值问题,给出核心处理的示意算法。
max=0;
for(i=1;i<=n;i++)
{scanf("%f",&x);
if(x>max) max=x;
}
当输入的n个数全为正数时,结果是正确的;如果输入的n个数全为负数,求得的最大值为0,显示这个结果不对,由这个简单的例子可以说明算法正确性的内涵。
(2)可读性
一个好的算法首先应该便于人们理解和相互交流,其次才是机器可执行。可读性好的算法有助于人对算法的理解,反之难懂的算法易于隐藏错误且难于调试和修改。
(3)健壮性(鲁棒性)
即对非法输入的抵抗能力。它强调即使输入了非法数据,算法应能加以识别并作出处理,而不是产生误动作或陷入瘫痪。
(4)高效率和低存储量
算法的效率通常是指算法的执行时间。对于一个具体问题的解决,通常有多个算法,执行时间短的算法其效率就高。所谓的存储量需求,是指算法在执行过程中所需要的最大存储空间,这两者都与问题的规模有关。