跳转至

概述

此处汇集在编写项目“C++算法编程指南”过程中积累和整理的经典算法和算法问题。

算法笔记中对这些算法和问题进行了重新分类编目,不再区分算法的难度,也不按算法设计方法、数据结构等进行分类,而是按照算法本身所要处理的问题领域进行分类。

算法的描述分为以下几个部分进行摘要式说明,不采用教学式的详细解说,也不提供具体的实现代码。

  1. 问题描述
  2. 思路解析
  3. 算法伪码
  4. 算法总结

问题描述部分给出算法的特性标签,包括算法类型(例如递归、二分、迭代、前缀和、高精度、高性能等)、设计方法(贪心、分治、动态规划、回溯、分支限界)、数据结构、预先知识等。

思路解析为简要描述,但会给出其在“C++算法编程指南”中的章节链接,若需了解详情应前往该项目章节进行阅读。

算法伪码参考《算法导论》一书中所使用的语法和格式,不同之处为凡涉及顺序序列,均从0开始对元素进行编号。

算法总结部分给出算法的时间复杂度、空间复杂度、优缺点、注意点、适用与不适用场景等,但不做详细分析。

伪代码书写惯例

  • 关键字

    \text{IF, THEN, ELSE, WHILE, DO, FOR, TO, FOREACH, IN, RETURN, BREAK, CONTINUE}

  • 算法命名

    英语单词或词组,首字母大写,词组中多个单词之间直接连接,不使用连字符。

  • 变量与范围

    单个变量使用小写字母,序列、矩阵及更高维的张量使用大写字母。

    P[i] 表示序列 P 的第 i 个元素,P[0] 为首元素;

    P[i:j] 表示序列 P 中左闭右开区间 [i,j) 上的子序列;

    P[i..j] 表示序列 P 中闭区间 [i,j] 上的子序列,故有 P[i:j]=P[i..j-1]

    P[f(k)],k\in K 表示序列中下标为函数值 f(k) 的元素,Kk 的取值集合,例如 P[2k-1],k\in\Bbb{Z}^+ 表示 P 中所有奇数下标的元素;

    P[i,j] 表示序列中的两个不同元素 P[i]P[j],位置可不连续,多个时表示法类似,多个下标间用逗号分隔;

    下标的逗号分隔表示法适用于上述各种范围表示法的组合,例如 P[0:3,6,10..12] 表示序列 P 中的 0, 1, 2, 6, 10, 11, 12 号元素。

  • 赋值

    使用符号 \leftarrow 表示赋值,直接使用序列、矩阵、张量的变量名赋值而未指定范围的时候表示对其中所有元素赋相同的值。

  • 代码块

    采用和 Python 类似的缩进规则标识代码块,引起缩进的语句之后以 : 结尾,包括 \text{DO, THEN, ELSE}。若语句合并为一行则可省略冒号 :

    顺序执行的语句合并为一行时,中间用逗号 , 分隔。

  • 注释

    仅使用单行注释,以 // 开头。