零基础学C语言(升级版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.1 算法的基本概念

算法与程序设计以及数据结构密切相关,它是解决一个问题的完整步骤的描述,是解决问题的策略、规则和方法。正如著名计算机科学家Nkiklaus Wirth(尼克劳斯·沃斯)提出的公式:

数据结构+算法=程序

如果把程序比作一个人,那么数据结构就是人的躯体,而算法就是人的灵魂。所以说,算法是程序不可缺少的部分。算法的描述形式有很多种,例如,传统流程图、结构化流程图及计算机程序语言等。下面具体介绍算法的几个特性,并分析一个好的算法应该具备哪些特点。

2.1.1 算法的特性

视频讲解:资源包\Video\02\2.1.1算法的特性.mp4

算法是为解决某一特定类型的问题而设计的一个实现过程,它具有下列特性。

(1)有穷性

一个算法必须在执行有穷步之后结束,并且每一步都在有穷时间内完成,不能无限地执行下去。就像图2.1所示的数学中的线段一样,有起点,也有终点,不能无限地延长。

例如,要编写一个由小到大的整数累加的程序,这时要注意一定要设一个整数的上限,若没有这个上限,那么程序将无终止地运行下去,也就是常说的“死循环”。

(2)确定性

算法的每一个步骤都应当是有确切定义的,对于每一个过程都不能有二义性,对将要执行的每个动作必须做出严格而清楚的规定。

(3)可行性

算法中的每一步都应当能有效地运行,也就是说,算法是可执行的,并要求最终得到正确的结果。例如,如图2.2所示的这段程序,代码中的“z=x/y;”就是一个无效的语句,因为0是不可以做分母的。

图2.1 线段

图2.2 不可执行的代码

(4)有输入

一个算法可以有一个或多个输入,也可以没有输入,输入就是在执行算法时有必要从外界获取的,如算法所需的初始量等一些信息。例如:

(5)有输出

一个算法有一个或多个输出,输出就是算法最终所求的结果。编写程序的目的就是要得到一个结果。例如,在控制台输出“MingRi”,如图2.3所示。

图2.3 在控制台上输出的结果

如果一个程序运行下来没有任何结果,那么这个程序本身也就失去了意义。

2.1.2 算法的优劣

视频讲解:资源包\Video\02\2.1.2算法的优劣.mp4

衡量一个算法的好坏,通常要从以下几个方面来分析。

(1)正确性,即所写的算法能满足具体问题的要求,即对任何合法的输入,算法都会得出正确的结果。

(2)可读性,是指算法被写好之后,该算法被理解的难易程度。一个算法可读性的好坏十分重要,如果一个算法比较抽象,难于理解,那么这个算法就不易被交流和推广使用,对于修改、扩展及维护都十分不方便。因此在写一个算法时,要尽量将该算法写得简明易懂。例如,汉字的繁体字和简体字,繁体字书写麻烦,笔画太多,而且难记,但简体字书写简单,可读性好。

(3)健壮性,是指当输入的数据非法时,算法也会做出相应判断,而不会因为输入错误造成程序“瘫痪”。

(4)时间复杂度与空间复杂度。简单地说,时间复杂度就是算法运行所需要的时间。不同的算法具有不同的时间复杂度,当一个程序较简单时,可能感觉不到时间复杂度的重要性;当一个程序特别复杂时,便会察觉到时间复杂度实际上是十分重要的。因此,写出更高效的算法一直是改进的目标。空间复杂度是指算法运行所需的存储空间的多少。