提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、算法的基本概念
1.1算法简介
算法与程序设计及数据结构密切相关,是解决一个问题的完整步骤描述,更是解决这个问题的策略、规则和方法。算法的米哦啊书形式有很多种类,如传统的流程图、结构化流程图及计算机程序语言等。
1.2算法的特征
算法是为解决某一特定类型的问题而制定的一个实现过程,它具有下列特征:
- [有穷性]一个算法必须在执行有穷步后结束,且每一步都可在有穷时间内完成,不能无限的执行下去,如果要编写一个由小到大的整数累加的程序,就需要给出整数的上限,也就是加到哪个数为止。若没有上限,那么程序将无终止的运行下去
- [确定性]算法的每一个步骤都应当有确切定义,每一个过程都不能有二义性,必须对将要执行的每个动作做出严格而清楚的规定。
- [可行性]算法中的每一步都应当能有效运行,也就是说算法是可执行的,并能够最终得到正确的结果。如下程序
int x,y,z;
scanf("%d,%d,%d",&x,&y,&z);
if(==0)
z=x/y;
- [输入]一个算法应有零个或多个输入。输入就是执行算法时需要从外界取得的一些必要的(如算法所需要的初始变量等)信息。例如
int a,b,c;
scanf("%d,%d,%d",&a,&b,&c);
上面的代码有3个输入,又如:
main()
{
printf("Hello Word!");
}
上面的代码需要0个输入。
- [输出]一个算法应有一个或多个输出。输出就是算法最终所求得的结果。编写程序的目的就是要得到一个结果,如果一个程序运行下来没有任何结果,那么这个程序的本身也就失去了意义。需要注意的是:一个程序,可能存在输入,也可能不存在输入,但一定存在输出。
1.2.1算法的优劣
1. 正确性
正确性是指所写的算法应满足具体问题的要求,即对任何合法的输入,算法都会得出正确的结果。
2. 可读性
可读性是指算法被写好后,该算法被理解的难以程度。一个算法可读性的好坏十分重要,如果一个算法比较抽象,难以理解,那么这个算法就不易于进行交流和推广使用,其后续修改、拓展、维护都十分不方便。因此在写一个算法的时候,要尽量对该算法写的简明、易懂。
3. 健壮性
一个程序完成后,运行该程序的用户对程序的理解各有不同,并不能保证每一个都能按照要求进行输入。健壮性就是指当输入的数据非法时,算法也会做出相应的判断,而不会因为输入的错误造成瘫痪。
4. 时间复杂度与空间复杂度
简单的来说,时间的复杂度就是算法运行所需要的时间。不同的算法具有不同的时间复杂度,当一个程序较小的时候,会感觉不到时间复杂度的重要性;当一个程序特别大时,时间复杂度实际上是十分重要的。因此,如何写出更高速的算法一直是算法优化的目标。空间复杂度是指算法运行时所需的存储空间的大小。随着计算机硬件的发展,空间复杂度已经不再显得那么重要。
ps:这里举个小例子:在游戏GTAV中线上模式中开头的加载界面可谓是让我寸阴若岁
常常需要等待数十分钟,还时常掉线,那么在这期间R对你的电脑做了些什么呢?
根据国外大神(TCST)使用逆编译器逐条点击后发现,原来是R的写的代码过于低效,加载时,一个if语句循环了19.8亿次。
以上的例子体现了算法的重要性,以及算法对大型项目的时间复杂度与空间复杂度的不可或缺性。
二、算法描述
2.1自然语言
自然语言就是人们日常所使用的语言,这种表述方式通俗易懂,下面通过实例具体介绍。
[例]求N!。
算法描述如下:
(1)定义3个变量i、n、及null,为i和null为1.
(2)从键盘中输入一个数,赋值给n。
(3)将null乘i的结果赋值给 null。
(4)将i的值加1,判断i的值是否大于n,如果大于n,则执行步骤5,否则执行步骤(3)
(5)将null的结果输出。
2.2流程图
流程图是一种传统的算法表示法,它用一些图框来代表各种不同的性质的操作,用流程线来指示算法的执行方向。由于它直观形象,易于理解,所以应用广泛。特别是在语言发展的早期阶段,只有通过流程图才能简明地表示算法。
2.2.1流程图符号
流程图使用一些图框来表示各种操作。如下
这些框线组成了流程图
网上关于流程图的教程较多,这里不多复述。