- 6
- 0
- 约2.04千字
- 约 5页
- 2017-08-20 发布于北京
- 举报
基础算法
从广义上讲,算法是指为解决一个问题而采用的方法和步骤;从程序计设的角度上讲,算法是指利用程序设计语言的各种语句,为解决特定的问题而构成的各种逻辑组合。我们在编写程序的过程就是在实施某种算法,因此程序设计的实质就是用计算机语言构造解决问题的算法。
算法是程序设计的灵魂,一个好的程序必须有一个好的算法。
算法具有五个特征:
1、有穷性: 一个算法应包括有限的运算步骤,执行了有穷的操作后将终止运算,不能形成死循环;
2、确切性: 算法的每一步骤必须有确切的定义,读者理解时不会产生二义性。并且,在任何条件下,算法只有唯一的一条执行路径,对于相同的输入只能得出相同的输出;
3、输入:一个算法有0个或多个输入,以描述运算对象的初始情况;
4、输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果,这是算法设计的目的,它们是与输入有着某种特定关系的量。如果一个程序没有输出,程序就毫无意义了;
5、可行性: 算法中每一步运算应该是可行的。算法原则上能够精确地运行,而且做有限次运算后即可完成。
如何来评价一个算法的好坏呢?主要是从两个方面:
一是看算法运行所占用的时间;我们用时间复杂度来衡量,例如:在以下3个程序中,
(1)x:=x+1
(2)for i:=1 to n do
x:=x+1
(3)for i:=1 to n do
for j:=1 to n do
x:=x+1
语句x:=x+1出现的次数分别为1,n和n2,则这三个程序段的时间复杂度分别为O(1),O(n),O(n2),分别称为常量阶、线性阶和平方阶。在算法时间复杂度的表示中,还有可能出现的有:对数阶O(log n),指数阶O(2n)等。在n很大时,不同数量级的时间复杂度有:O(1) O(log n)O(n) O(nlog n)O(n2) O(n3) O(2n),很显然,指数阶的算法不是一个好的算法。
二是看算法运行时所占用的空间,既空间复杂度。由于当今计算机硬件技术发展很快,程序所能支配的自由空间一般比较充分,所以空间复杂度就不如时间复杂度那么重要了,有许多问题人们主要是研究其算法的时间复杂度,而很少讨论它的空间耗费。
在中学生信息学奥赛中,对程序的运行时间作出了严格的限制,如果运行时间超出了限定就会判错,因此在设计算法时首先要考虑的是时间因素,必要时可以以牺牲空间来换取时间,动态规划法就是一种以牺牲空间换取时间的有效算法。对于空间因素,视题目的要求而定,一般可以不作太多的考虑。
通过一个简单的数值计算问题,来比较两个不同算法的效率(在这里只比较时间复杂度)。
例题:求100-999中的水仙花数(若三位数abc,abc=a3+b3+c3,则程abc为水仙花数,如:13+53+33=1+125+27=153,则153是水仙花数)。
分析:我们可以将100到999之间的每一个数一一验证,从而找出所有的水仙花数。
算法1:
For m:=100 to 999 do
Begin
a:=m div 100;
b:= (m mod 100) div 10;
c:=m mod 10;
if a*a*a+b*b*b+c*c*c=m
then write(m:6);
End;
算法2:
For a:=1 to 9 do {百位数}
For b:=0 to 9 do {十位数}
For c:=0 to 9 do {个位数}
if a*a*a+b*b*b+c*c*c=a*100+b*10+c
then write(a*100+b*10+c:6);
前一种方法运行次数为:(999-100+1)*4=3600条语句;
后一种方法运行次数为:9*10*10*1=900条语句,所以后一种方法效率更高。
分析对比两种算法就不难看出,算法2的执行时间远远小于算法1的执行时间。
在信息学奥赛中,其主要任务就是设计一个有效的算法,去求解所给出的问题。如果仅仅学会一种程序设计语言,而没学过算法的选手在比赛中是不会取得好的成绩的,选手水平的高低在于能否设计出好的算法。
后面,我们根据全国分区联赛大纲的要求,一起来探讨信息学奥赛中的基本算法。
算法的分类:数值的和非数值的
数值的算法是以数学方式表示的问题求数值解的方法,如:代数方程计算、矩阵计算、线性方程组求解、函数方程求解等;
非数值的算法是求非数值解的方法,如排序查找、模式匹配、排列模拟、表格处理、文字处理等。
3. 算法设计:主要是针对各类具体问题设计良好的算法及研究设计算法的规律和方法。
4. 常用的算法设计方法:
数值算法:迭代法、递归法、插值法等;
非数值算法:分治法、贪心法、回溯法等。
5. 算法分析:是对设计出的每一个具体的算法,利用数学工
原创力文档

文档评论(0)