目录
5.2.1 算法的概念
算法的定义
算法的重要性
算法与数据结构的关系
算法的分类
算法的衡量标准
5.2.2 算法的描述方法
自然语言描述
流程图描述
NS 结构化流程图描述
伪码描述
算法描述方法的选择
5.2.1 算法的概念
算法的定义
不管使用哪种程序设计语言,编程者必须在程序中明确而详细地说明他们想让计算机做什么以及如何做。所谓算法(Algorithm),简单地说,就是为解决一个具体问题而采取的确定、有限、有序、可执行的操作步骤。当然,程序设计中的算法仅指计算机算法,即计算机能够执行的算法。
算法的重要性
程序设计是一门艺术,主要体现在算法设计和结构设计上。如果说结构设计是程序的肉体,那么算法设计就是程序的灵魂(Donald E. Knuth)。
算法与数据结构的关系
著名的计算机科学家沃思(N. Wirth)曾提出一个经典公式:
数据结构 + 算法 = 程序
这个公式仅对面向过程的语言(如 C 语言)成立,它说明一个程序应由两部分组成:
- 数据结构(Data Structure):是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。
- 算法:是对操作或行为(即操作步骤)的描述。算法代表着用系统的方法描述解决问题的策略。不同的算法可能用不同的时间、空间或效率来完成同样的任务。
算法的分类
计算机进行问题求解的算法大致可分为如下两类:
数值算法:主要用于解决数值求解问题。
非数值算法:主要用于解决需要用逻辑推理才能解决的问题,如人工智能中的许多问题以及搜索、分类等问题都属于这类算法。
算法的衡量标准
衡量一个算法的正确性一般可用如下基本特性来衡量:
- 有穷性:算法包含的操作步骤应是有限的,每一步都应在合理的时间内完成,否则算法就失去了它的使用价值。
- 确定性:算法的每个步骤都应是确定的,不允许有歧义。例如,“如果 x ≥ 0,则输出 Yes;如果 x ≤ 0,则输出 No” 就是有歧义的,即当 x 等于 0 时,既要输出 Yes,又要输出 No,这就产生了不确定性。
- 有效性:算法中的每个步骤都应能有效执行,且能得到确定的结果。例如,对一个负数开平方或者取对数,就是一个无效的操作。
- 允许没有输入或者有多个输入。
- 必须有一个或者多个输出。
5.2.2 算法的描述方法
算法的描述方法主要有如下几种。
自然语言描述
用自然语言(Natural Language)描述算法时,可使用汉语、英语和数学符号等,通俗易懂,比较符合人们的日常思维习惯,但描述文字显得冗长,在内容表达上容易引起理解上的歧义,不易直接转化为程序,所以一般适用于算法较为简单的情况。
流程图描述
流程图(Flow Chart)是描述程序的控制流程和指令执行情况的有向图,它是程序的一种比较直观的表示形式。美国国家标准化协会(ANSI)规定了如图 5-1 所示的符号作为常用的流程图符号。用传统流程图描述算法的优点是流程图可直接转化为程序,形象直观,各种操作一目了然,不会产生歧义,易于理解和发现算法设计中存在的错误;但缺点是所占篇幅较大,允许使用流程线,使用者可使流程任意转向,降低程序的可读性和可维护性,使程序难于理解和修改。
NS 结构化流程图描述
NS 结构化流程图是由美国学者 I. Nassi 和 B. Schneiderman 于 1973 年提出的,NS 图就是以这两位学者名字的首字母命名的。它的最重要的特点就是完全取消了流程线,这样迫使算法只能从上到下顺序执行,从而避免了算法流程的任意转向,保证了程序的质量。与传统的流程图相比,NS 图的另一个优点就是形象、直观,节省篇幅,尤其适合于结构化程序的设计。
例如,用传统流程图表示的顺序结构如图 5-2(a) 所示,用 NS 图表示的顺序结构如图 5-2(b) 所示,表示先执行 A 操作,再执行 B 操作,两者是顺序执行的关系。
伪码描述
伪码(Pseudocode),或称伪代码,是指介于自然语言和计算机语言之间的一种代码,它的最大优点是,与计算机语言比较接近,易于转换为计算机程序。书写无固定格式和规范,比较灵活。
算法描述方法的选择
当我们面对一个实际生活问题时,首先应通过抽象、分解、归纳、约简等分析手段将问题抽象为数学模型,并设法找到其求解方法,然后将问题求解方法用算法描述出来,进一步分析是否存在更优(如效率更高)的求解方法,最后再将算法编码实现。
在上述 4 种算法描述方法中,传统流程图是初学者最易掌握,也最清晰直观的一种算法描述方法,在流程图上排查算法的逻辑错误也比直接在代码上查找更快,更有效。因此,在学习程序设计时应养成 “先画程序流程图、然后再编写代码” 的好习惯。