14.1 算法的特性
算法是解决问题的步骤序列。课程把它称为“程序的灵魂”:同一个数据结构,不同算法会带来不同的时间效率和空间效率。算法可以用自然语言、流程图、伪代码或程序设计语言表示,软考下午算法题常用 C 语言风格代码。
算法的表达方式
| 表达方式 | 特点 | 考试关联 |
|---|---|---|
| 自然语言 | 接近日常描述 | 题干常用自然语言描述算法过程 |
| 流程图 | 强调控制流程 | 早期和基础题可能出现 |
| 伪代码 | 介于语言和代码之间 | 近年出现较少 |
| 程序设计语言 | 可执行或接近可执行 | 下午算法应用题常见 C 语言代码填空 |
五个基本特性
| 特性 | 含义 | 易混点 |
|---|---|---|
| 有穷性 | 有穷步后结束,且每一步在有穷时间内完成 | 排除死循环 |
| 确定性 | 每条指令含义明确,无二义性 | 排除模棱两可的描述 |
| 可行性/有效性 | 每一步都能有效执行,执行有限次可得到结果 | 不等同于有穷性 |
| 输入 | 可以有 0 个或多个输入 | 没有输入也可以运行 |
| 输出 | 至少有 1 个输出 | 没有输出无法体现结果 |
有穷性与可行性不要混
课程特别提醒:很多同学看到“有限次”就以为是有穷性。更准确地看:
| 概念 | 关注点 |
|---|---|
| 有穷性 | 算法整体会结束,每一步耗时有限 |
| 可行性 | 每一步操作是实际可执行的,不是非法或不可实现的动作 |
例如“不断循环直到永远”违反有穷性;“把一个数除以 0 得到正常结果”违反可行性。
输入可以没有,输出必须有
算法可以没有外部输入,例如输出系统当前时间、生成一个固定表格。但算法必须有输出,否则无法体现求解结果,也无法判断算法是否完成。
本节例题
关于算法特性,下列说法正确的是:
自查清单
- 能否区分有穷性与可行性?
- 能否解释为什么算法可以没有输入?
- 能否识别“含义模糊”违反确定性?