算法

概述

算法(algorithm)是用于执行计算或求解问题的有限精确指令序列,必须具备输入、输出、确定性、有限性、有效性等特性。“algorithm”一词源自 9 世纪数学家 al-Khowarizmi。算法通过伪代码进行与编程语言无关的精确描述,涵盖搜索、排序、字符串匹配、贪心策略等经典设计范式。停机问题的不可判定性揭示了计算的内在极限。

定义

算法(Algorithm)

算法是一个用于执行计算或求解问题的有限精确指令序列

  • “algorithm”一词源自 9 世纪数学家 al-Khowarizmi 的名字,最初指用十进制记数法进行算术运算的规则,后来演变为包含所有用于求解问题的确定过程的更一般概念

算法的五大特性

特性说明
输入(Input)算法从指定的集合中接收输入值
输出(Output)对于每组输入值,算法产生指定集合中的输出值,即问题的解
确定性(Definiteness)算法的每一步都必须被精确地定义
有限性(Finiteness)对于任何输入,算法应在有限步之后产生期望的输出
有效性(Effectiveness)算法的每一步都必须能在有限时间内精确地执行

伪代码(Pseudocode)

伪代码是介于自然语言描述和编程语言实现之间的中间表示,其指令类似于编程语言中的语句,但可以使用任何定义良好的操作或语句。

结构语法说明
赋值变量 := 表达式将表达式的值赋给变量
条件语句if 条件 then 语句条件为真时执行
循环for 变量 := 初值 to 终值计数循环
循环while 条件条件循环
过程procedure 名称(参数)定义一个过程
返回return 值返回结果

线性搜索(Linear Search)

线性搜索从列表的第一个元素开始,逐个将目标元素 与列表中的元素进行比较,直到找到匹配或搜索完整个列表。

  • 返回值为 在列表中的位置(下标),若未找到则返回 0
  • 时间复杂度:最坏情况下需要比较 次,即
  • 适用条件:列表中的元素可以是任意顺序

二分搜索(Binary Search)

二分搜索利用列表有序这一条件,通过反复将搜索区间减半来快速定位目标元素。

  • 时间复杂度:每次将搜索区间减半,最坏情况下需要 次比较
  • 适用条件:列表必须按递增顺序排列
  • 核心思想:比较 与中间元素 ,若 则搜索右半部分,否则搜索左半部分

冒泡排序(Bubble Sort)

冒泡排序通过反复比较相邻元素,若顺序错误则交换它们,使较大的元素逐渐”下沉”到列表末尾,较小的元素”上浮”到列表前端。

  • 趟遍历后,最大的 个元素已就位
  • 时间复杂度 次比较

插入排序(Insertion Sort)

插入排序从第二个元素开始,将每个元素插入到前面已排序部分的正确位置。

  • 在第 步中,第 个元素被插入到前 个已排序元素中的正确位置
  • 时间复杂度:最坏情况下 次比较;最好情况(已排序) 次比较

贪心算法(Greedy Algorithm)

贪心算法在每一步做出局部最优选择,而不考虑所有可能导向全局最优解的步骤序列。

  • 贪心算法的设计关键在于选择合适的贪心准则
  • 贪心算法不一定总能找到最优解,需要通过证明或反例来验证
  • 即使贪心算法不总能找到最优解,它仍然可能找到可行解

停机问题(Halting Problem)

停机问题:是否存在一个过程,以程序 和输入 为输入,能够判定 在给定 时是否会最终停止?

Alan Turing(1936)通过反证法证明了不存在这样的过程

  1. 假设存在这样的过程 ,它输出 “halt” 或 “loops forever”
  2. 构造过程 :若 输出 “loops forever”,则 停止;若 输出 “halt”,则 无限循环
  3. 考虑 :无论 输出什么,都产生矛盾
  4. 因此 不可能对所有输入给出正确答案,即停机问题是不可判定的

核心性质

性质描述说明
有限性算法必须在有限步后终止区别于可能无限循环的程序(如操作系统)
确定性每一步必须被精确地定义不允许模糊或歧义的指令
有效性每一步可在有限时间内执行操作必须是基本且可实现的
线性搜索复杂度适用于任意列表,无需预处理,小数据集首选
二分搜索复杂度要求列表有序,多次搜索同一列表时总体更高效
冒泡排序复杂度始终 即使列表已有序仍执行全部比较
插入排序最优情况已有序列表仅需 对”几乎有序”数据表现优异
贪心算法不保证最优局部最优不等于全局最优最优性依赖于具体问题的贪心准则
停机问题不可判定不存在通用判定过程Turing 1936 年证明,使用对角线论证

关系网络

graph TB
    A["算法"] --> B["函数"]
    A --> C["大O记号"]
    A --> D["算法复杂度"]
    A --> E["序列与求和"]

    A --> F["搜索算法"]
    A --> G["排序算法"]
    A --> H["贪心算法"]
    A --> I["递归算法"]
    A --> J["停机问题"]

    F --> F1["线性搜索 O(n)"]
    F --> F2["二分搜索 O(log n)"]

    G --> G1["冒泡排序 O(n²)"]
    G --> G2["插入排序 O(n²)"]

    B --> B1["算法操作函数"]
    C --> C1["度量算法效率"]
    D --> D1["分析框架"]
    E --> E1["递推关系"]

    style A fill:#5cb85c,color:#fff
    style B fill:#4a90d9,color:#fff
    style C fill:#d9534f,color:#fff
    style D fill:#e8a838,color:#fff
    style E fill:#9b59b6,color:#fff
  • 函数 是算法操作的基础:算法的每一步操作本质上是对输入数据的函数变换
  • 大O记号 用于度量算法效率:通过渐近分析比较不同算法的性能
  • 算法复杂度 提供分析框架:从最坏情况、平均情况、最好情况三个视角评估算法
  • 序列与求和 中的递推关系是分析递归算法复杂度的核心工具

章节扩展

第3章:算法

算法是第 3 章的核心主题(3.1 节),是离散数学从理论走向实践的关键桥梁:

  • 3.1 算法:算法的定义与五大特性、伪代码语法、搜索算法(线性搜索、二分搜索)、排序算法(冒泡排序、插入排序)、字符串匹配、贪心算法、停机问题
  • 3.2 函数的增长:大O、大、大 等渐近记号,为算法效率比较提供数学基础
  • 3.3 算法复杂度分析:时间复杂度与空间复杂度的度量方法,最坏情况与平均情况分析,NP完全问题与 P vs NP

第5章:归纳与递归

  • 5.4 递归算法:递归算法是第5章引入的新算法范式,通过函数调用自身来求解问题。递归算法的正确性用数学归纳法证明,复杂度通过递推关系分析。归并排序是递归分治策略的经典应用。

第13章:计算建模

  • 13.5 图灵机图灵机(Turing Machine)是算法概念的终极精确化。第3章中算法的五大特性(输入、输出、确定性、有限性、有效性)在图灵机模型中得到了完全的形式化:有限状态控制对应有限性,转移函数对应确定性,读写头移动对应逐步执行。Church-Turing 论题断言:任何”有效可计算”的函数都存在图灵机来计算它。因此,图灵机为”什么是算法”这一问题提供了数学上严格的回答。

补充

算法概念的历史与学术背景

“algorithm”一词源自 9 世纪波斯数学家 al-Khowarizmi(约 780—850)的名字,其著作《印度数字算术》系统介绍了十进制记数法与算术运算规则。现代算法理论的基础由 Alan Turing 在 1936 年的论文 “On Computable Numbers” 中奠定,该论文引入了图灵机模型并证明了停机问题的不可判定性。伪代码作为一种”程序设计语言无关”的算法描述方式,由 Donald Knuth 在《The Art of Computer Programming》第 1 卷(Knuth, 1968)中系统推广。

学术来源:Rosen, K. H. (2019). Discrete Mathematics and Its Applications (8th ed.). McGraw-Hill, Section 3.1.

参考链接:Cormen, T. H., Leiserson, C. E., Rivest, R. L., & Stein, C. (2022). Introduction to Algorithms (4th ed.). MIT Press.

参见

  • 函数 — 算法的每一步操作本质上是对数据的函数变换
  • 大O记号 — 度量算法效率的渐近记号
  • 算法复杂度 — 时间复杂度与空间复杂度的系统分析方法
  • 序列与求和 — 递推关系是分析递归算法复杂度的核心工具