算法是在有限步骤内求解某一问题所使用的一组定义明确的规则。通俗点说,就是计算机解题的过程。在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法。前者是推理实现的算法,后者是操作实现的算法。
一个算法应该具有以下五个重要的特征:
- 有穷性: 一个算法必须保证执行有限步之后结束;
- 确切性: 算法的每一步骤必须有确切的定义;
- 输入:一个算法有0个或多个输入,以刻画运算对象的初始情况;
- 输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;
- 可行性: 算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。
引用:
算法,一个既陌生又熟悉的名词。说陌生,因为算法概念从未进入我国中学数学教学大纲。新的高中数学课程标准破天荒地把算法作为重要内容列入必修课,自然出乎人们的意料。说到熟悉,那是因为从小学就开始接触算法。例如做四则运算要先乘除后加减,从里往外脱括弧,竖式笔算等等都是算法,只要按照一定的程序一步一步做,一定不会错。至于乘法口诀、珠算口诀更是算法的具体体现。因此,算法其实是耳熟能详的数学对象。一般地,算法是指在解决问题时按照某种机械程序步骤一定可以得到结果的处理过程。这种程序必须是确定的、有效的、有限的。
中国古代数学以算法为主要特征。吴文俊指出:“我国传统数学在从问题出发以解决问题为主旨的发展过程中,建立了以构造性与机械化为其特色的算法体系,这与西方数学以欧几里得《几何原本》为代表的所谓公理化演绎体系正好遥遥相对。……肇始于我国的这种机械化体系,在经过明代以来几百年的相对消沉后,由于计算机的出现,已越来越为数学家所认识与重视,势将重新登上历史舞台[1]。”吴文俊创立的几何定理的机器证明方法(世称吴方法),用现代的算法理论,焕发了中国古代数学的算法传统,享有很高的国际声誉。他因此于2001年获得了第一届国家最高科学技术奖。
20世纪上半叶,科学研究方式归结为两种方式:理论+实验。后来由于计算机技术能力的开发,计算成为第三种重要手段。未来的趋势是,“理论+实验+计算”将成为标准的科学研究方法。那么,计算机如何按照人的意愿进行计算呢?这就要靠算法。因此,毫不夸张地说,算法既是数学科学的重要基础,也是计算机科学的核心。
虽然算法的历史悠久,而且几乎和计算机技术共生共长,但是力图使之成为现代公民的基本数学素质,列入中小学教育的基础课程,则只是近十余年的事。在我国,1980年的《辞海》还没有收入“算法”,只有“算法论”的条目( 那是“数理逻辑”学科的一个分支,相当专门)。1988年出版的《中国大百科全书(数学卷)》,才有了莫绍揆先生撰稿的“算法”辞条。其中详细地分析了算法的主要特征:能行性。其意思是:
1.输入输出的数据必须是由字母组成的有限符号串(例如不能输入一条曲线);
2.算法的处理过程必须可以明确地分解成有限多个不能再分解的步骤(例如不能把画无限多个点的曲线作为算法过程);
3.算法的继续进行和结束要有明确的条件加以规定;
4.算法的变换规则必须是非常简单而机械,不依赖于使用者的聪明才智。
用以上的四条来分析,小学里做四则运算,输入输出都是字母(阿拉伯数字),计算规则都是按一定次序执行有限步,而且按这一步骤去做一定成功,无须技巧,到了最后一步,结果自然就出来了。因此,“四则运算”的过程符合上述四条。
算法的思想, 不一定仅仅用于数字计算,它可以广泛地描述许多操作过程。例如,有一队士兵要过河,但当时只有一条小船,上面有两个小孩。小船至多可以载一个士兵或者两个小孩,请问这队士兵依照何种程序才能渡过此河?可以用流程图加以表示:
同样可以画出求解一元一次方程的流程图(算法流程图的详细程度依赖于读者的需要)。
那么如何在计算机上实施这一算法呢?那就要设计程序语言。例如要求非负整数 a, b 的最大公因子,熟知的方法是欧几里得算法。与该算法相应的计算机程序可以是:
input(a,b)
(x,y) ← (a,b)
more:if x=0 then goto enough
if y≧x then y ← y-x else
(x,y) ← (y,x)
goto more
enough: output(y)
算法程序是由语句组成的。符号(x,y) ← (a,b) 的意思是同时把 a 和 b的值赋给 x和y,称为赋值语句。 If … then… else表示条件语句。
计算机执行上述的指令,按部就班地操作即可得到结果。例如,将 a= 4,b=10 作为初始值赋予(x,y)。那么按照指令就有 (4,10)→(4,6)→(4,2)→(2,4)→(2,2)→(0,2),得到结论:最大公因子为2。
在处理迭代过程等程序时,还要使用循环语句。上面的士兵过河问题,就需要机械地循环操作。新课程标准要求学生了解赋值、条件、循环等三种语句,并尽可能在计算机上进行实际操作,亲身体验由人指挥机器的效果。在信息时代,这是一种人人都需要具备的科学素养。数学和信息技术课的教师可以密切合作,完成算法的教学。
最后,谈谈算法复杂性问题。
假定一个班上有50名学生,现在要按照姓名的拼音顺序排成一张表。 一个最笨的算法是将50个学生所有可能排列的表都打出来,然后从中挑选一张符合拼音顺序的表。要知道,50个人的不同排列有50!种,即这样的表有50!张,它大约是3×1064。这个数目之大,用每秒100万次的计算机不停地运算需要9.6 ×1048世纪,显然是不能实施的。
但是可以不用这样的笨办法,采用以下大家常用的算法来排。随便拿一位同学的名字排在第一位。任取第二位同学的名字先放在第一位,然后依拼音顺序和第一位的名字比较一次,放在适当位置。第三位则需要和前两位的名字比较至多两次。依次类推,第k位至多要比较k-1次,第50 位至多需要比较49次。这样,只要比较1+2+…+49=49×50/2=1225次,就完成了排序。如果班上有n 个学生,第一种算法需要运算 n!(当n>25, n!>10n )次,第二种算法至多需要 (n –1)n/2 次。前者的次数随n的增加,按超10n 的指数方式增加,后者则只按n 的二次多项式的方式增加。一般地,假如在一个问题中有n个数据需要处理,而处理的算法的计算次数依指数n方式增加,称之为指数算法;若按n 的多项式方式增加,则称为多项式算法。当今的计算机无法承受指数算法的运算。因此寻找各种问题的多项式算法,乃是数学发展的一个重大的关节点。
算法, 披着时代的盛装,沿着信息传递的脚步,正在悄悄地走进人们的生活,跨入中学的课堂。让我们举起双手,欢迎算法的到来!
[1] 吴文俊. 九章算术与刘徽. 北京:北京师范大学出版社,1982