难点概览
算法(Algorithm) 是对特定问题求解步骤的描述,是一个有穷的指令序列。
学这个概念时,关键不是背定义,而是理解:算法必须能在有限步骤内,把输入加工成符合要求的输出。
这张教材截图讲的是“算法的基本概念”。它不是一道选择题,而是数据结构与算法学习中的基础知识点:先讲什么是算法,再讲一个有效算法必须具备的五个特性,最后说明评价一个好算法时要看哪些目标。
原图内容

截图中的重点可以归纳为三部分:
- 算法定义:对特定问题求解步骤的描述,是有穷的指令序列。
- 算法五大特性:有穷性、确定性、可行性、输入、输出。
- 好算法的评价目标:正确性、可读性、健壮性、高效率与低存储量需求。
一句话理解算法
算法就是“解决某个问题的一套有限步骤”。
比如“在数组中查找一个数”就是一个问题。可以设计这样的算法:
从第一个元素开始看;
如果等于目标值,就返回它的位置;
如果不等于,就继续看下一个;
直到找到目标值,或者全部看完。
这就是一个算法,因为它有明确步骤,也会在有限次数后结束。
算法的定义拆解
教材定义是:
算法是对特定问题求解步骤的描述,是一个有穷的指令序列,其中每条指令表示一个或多个操作。
这句话可以拆成四个关键词:
| 关键词 | 含义 | 例子 |
|---|---|---|
| 特定问题 | 算法一定是为了解决某类问题 | 排序、查找、求最大值 |
| 求解步骤 | 不是只给结果,而是给过程 | 第一步比较,第二步交换 |
| 有穷 | 步骤不能无限执行 | 循环必须能结束 |
| 指令序列 | 每一步要能被执行 | 赋值、比较、加减、移动指针 |
所以,算法不是一句“把数组排好序”这么简单,而是要说明怎样一步一步排好序。
五大特性之一:有穷性
有穷性:算法必须在执行有限步之后结束,并且每一步都能在有限时间内完成。
这说明算法不能无限循环。
例如下面这个逻辑就不是合格算法:
while (1) {
// 一直执行,永远不结束
}
除非循环内部有明确的退出条件,否则它无法在有限步骤内结束,不满足有穷性。
一个合格的线性查找算法通常会这样写:
for (int i = 0; i < n; i++) {
if (A[i] == k) {
return i;
}
}
return -1;
最多检查 n 个元素,检查完就结束,因此满足有穷性。
五大特性之二:确定性
确定性:算法中每条指令必须有明确含义;对于相同输入,只能产生相同输出。
算法步骤不能含糊。
比如这句话就不够确定:
找一个差不多大的数。
“差不多”没有明确标准,不同人可能理解不同。
更确定的写法应该是:
找出数组中第一个大于等于 60 的元素。
这就有明确判断条件,计算机可以执行。
五大特性之三:可行性
可行性:算法中描述的操作,都可以通过已经实现的基本运算执行有限次来完成。
也就是说,算法不能写成现实中无法执行的魔法步骤。
例如:
一步得到所有可能答案中最优的那个。
这不是可行步骤,因为它没有说明如何得到。
可行的算法应该把过程拆成基本操作,例如:
枚举每一种可能方案;
计算每种方案的代价;
记录当前最小代价;
遍历结束后输出最优方案。
这样每一步都能由比较、赋值、循环等基本运算完成。
五大特性之四:输入
输入:算法可以有零个或多个输入,这些输入取自某个特定对象的集合。
注意:算法可以没有输入。
例如:
输出当前系统时间。
这个算法不需要用户额外输入,也可以运行。
但大多数算法都有输入,比如:
| 问题 | 输入 |
|---|---|
| 求最大值 | 一个数组 |
| 二分查找 | 有序数组、目标值 |
| 排序 | 一组待排序元素 |
| 求最短路径 | 图、起点、终点 |
输入决定了算法处理的对象。
五大特性之五:输出
输出:算法至少有一个输出,并且输出与输入之间存在某种特定关系。
算法不能没有结果。
比如排序算法的输出是排好序的序列:
输入:3, 1, 2
输出:1, 2, 3
查找算法的输出可以是元素位置:
输入:数组 A、目标值 k
输出:k 所在的位置;如果不存在,输出 -1
输出必须和输入有关系,否则就不是在解决问题。
好算法的四个评价目标
教材还提到:设计一个“好”的算法通常要满足以下目标。
| 评价目标 | 含义 | 通俗理解 |
|---|---|---|
| 正确性 | 能够正确解决给定问题 | 结果必须对 |
| 可读性 | 结构清晰,便于理解和交流 | 人能看懂,方便维护 |
| 健壮性 | 对非法或异常输入能适当处理 | 不轻易崩溃 |
| 高效率与低存储量需求 | 时间效率高,空间占用少 | 跑得快,占内存少 |
注意:这些目标之间有时会互相权衡。
例如,一个极致优化的算法可能速度很快,但代码难读;一个特别清晰的写法可能更适合教学,但效率不是最高。实际开发和考试分析时,要根据场景判断重点。
用“求数组最大值”串起来理解
假设问题是:给定数组 A,找出其中最大值。
一个简单算法如下:
int max = A[0];
for (int i = 1; i < n; i++) {
if (A[i] > max) {
max = A[i];
}
}
return max;
它为什么是算法?
| 特性 | 对应体现 |
|---|---|
| 有穷性 | 循环最多执行 n-1 次 |
| 确定性 | 每一步比较和赋值含义明确 |
| 可行性 | 只用到了比较、赋值、循环等基本操作 |
| 输入 | 输入是数组 A 和元素个数 n |
| 输出 | 输出数组中的最大值 |
它是不是好算法?
| 评价目标 | 分析 |
|---|---|
| 正确性 | 能找到最大值 |
| 可读性 | 逻辑清晰,容易理解 |
| 健壮性 | 如果考虑 n <= 0 的情况会更完善 |
| 效率 | 时间复杂度 O(n),额外空间 O(1) |
常见误区
| 误区 | 正确理解 |
|---|---|
| 算法就是程序 | 算法是解决步骤,程序是算法的具体实现 |
| 算法一定要有输入 | 可以有零个或多个输入 |
| 算法可以没有输出 | 不可以,至少要有一个输出 |
| 步骤越多越详细就越好 | 步骤要明确且可执行,不是越啰嗦越好 |
| 只要结果正确就是好算法 | 还要考虑可读性、健壮性、效率和存储需求 |
考试怎么问
这个知识点常见考法包括:
- 问算法的定义。
- 问算法的五个基本特性。
- 判断某个描述是否满足有穷性、确定性或可行性。
- 区分“算法必须有输入”和“算法必须有输出”。
- 问好算法的评价标准,尤其是时间效率和空间需求。
重点记住:
算法可以没有输入,但必须有输出;可以循环,但必须有限结束。
一句话记忆
算法 = 有穷步骤 + 明确指令 + 可执行操作 + 输入输出。
再记五大特性:
有穷、确定、可行、输入、输出。
自测题
- 算法是否必须有输入?
- 算法是否必须有输出?
- “一直重复直到满意为止”是否满足确定性?
- 一个好算法只需要结果正确吗?
- 不一定。算法可以有零个或多个输入。
- 必须。算法至少有一个输出。
- 不满足。“满意”没有明确标准,且可能无法有限结束。
- 不是。还要考虑可读性、健壮性、时间效率和空间需求。
