知识点讲解:算法的基本概念一文讲清

小明 发布于 阅读:19

难点概览

算法(Algorithm) 是对特定问题求解步骤的描述,是一个有穷的指令序列

学这个概念时,关键不是背定义,而是理解:算法必须能在有限步骤内,把输入加工成符合要求的输出。

这张教材截图讲的是“算法的基本概念”。它不是一道选择题,而是数据结构与算法学习中的基础知识点:先讲什么是算法,再讲一个有效算法必须具备的五个特性,最后说明评价一个好算法时要看哪些目标。


原图内容

算法基本概念教材截图

截图中的重点可以归纳为三部分:

  1. 算法定义:对特定问题求解步骤的描述,是有穷的指令序列。
  2. 算法五大特性:有穷性、确定性、可行性、输入、输出。
  3. 好算法的评价目标:正确性、可读性、健壮性、高效率与低存储量需求。

一句话理解算法

算法就是“解决某个问题的一套有限步骤”。

比如“在数组中查找一个数”就是一个问题。可以设计这样的算法:

从第一个元素开始看;
如果等于目标值,就返回它的位置;
如果不等于,就继续看下一个;
直到找到目标值,或者全部看完。

这就是一个算法,因为它有明确步骤,也会在有限次数后结束。


算法的定义拆解

教材定义是:

算法是对特定问题求解步骤的描述,是一个有穷的指令序列,其中每条指令表示一个或多个操作。

这句话可以拆成四个关键词:

关键词含义例子
特定问题算法一定是为了解决某类问题排序、查找、求最大值
求解步骤不是只给结果,而是给过程第一步比较,第二步交换
有穷步骤不能无限执行循环必须能结束
指令序列每一步要能被执行赋值、比较、加减、移动指针

所以,算法不是一句“把数组排好序”这么简单,而是要说明怎样一步一步排好序


五大特性之一:有穷性

有穷性:算法必须在执行有限步之后结束,并且每一步都能在有限时间内完成。

这说明算法不能无限循环。

例如下面这个逻辑就不是合格算法:

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)

常见误区

误区正确理解
算法就是程序算法是解决步骤,程序是算法的具体实现
算法一定要有输入可以有零个或多个输入
算法可以没有输出不可以,至少要有一个输出
步骤越多越详细就越好步骤要明确且可执行,不是越啰嗦越好
只要结果正确就是好算法还要考虑可读性、健壮性、效率和存储需求

考试怎么问

这个知识点常见考法包括:

  1. 问算法的定义。
  2. 问算法的五个基本特性。
  3. 判断某个描述是否满足有穷性、确定性或可行性。
  4. 区分“算法必须有输入”和“算法必须有输出”。
  5. 问好算法的评价标准,尤其是时间效率和空间需求。

重点记住:

算法可以没有输入,但必须有输出;可以循环,但必须有限结束。


一句话记忆

算法 = 有穷步骤 + 明确指令 + 可执行操作 + 输入输出。

再记五大特性:

有穷、确定、可行、输入、输出。


自测题

  1. 算法是否必须有输入?
  2. 算法是否必须有输出?
  3. “一直重复直到满意为止”是否满足确定性?
  4. 一个好算法只需要结果正确吗?
点击查看答案
  1. 不一定。算法可以有零个或多个输入。
  2. 必须。算法至少有一个输出。
  3. 不满足。“满意”没有明确标准,且可能无法有限结束。
  4. 不是。还要考虑可读性、健壮性、时间效率和空间需求。

收到2条评论
avatar
小明 1 小时前
看懂了,真不错!
commentator
小助理 1 小时前
哈哈,懂了就是赚到了!算法五大特性现在闭着眼都能背出来了吧 😎 继续加油,后面的排序和查找更刺激哦~ 有问题随时来评论区找我聊 💪