**算法**（英語：），在数学（算学）和计算机科学之中，指一个被定义好的、计算机可施行其指示的有限步骤或次序，常用于计算、数据处理和自动推理。算法可以使用条件语句通过各种途径转移代码执行（称为自动决策），并推导出有效的推论（称为自动推理），最终实现自动化。

相反，启发式是一种解决问题的方法，可能没有完全指定，也可能不能保证正确或最优的结果，尤其是在没有明确定义的正确或最优结果的问题领域。例如，社交媒体推荐系统依赖于启发式，尽管在21世纪的流行媒体中被广泛称为*算法*，但由于问题的性质，它无法提供正确的结果。

早在尝试解决希尔伯特提出的判定问题时，算法的不完整概念已经初步定型；在其后的正式化阶段中人們尝试去定义"有效可计算性（英语：）"或者"有效方法（英语：）"。这些尝试包括库尔特·哥德尔、雅克·埃尔布朗和斯蒂芬·科尔·克莱尼分别于1930年、1934年和1935年提出的递归函数，阿隆佐·邱奇于1936年提出的λ演算，1936年埃米尔·莱昂·珀斯特（英语：）的波斯特-图灵机和艾伦·图灵1937年提出的图灵机。即使在当下，依然常有符合直觉的想法难以定义为形式化算法的情况。

算法是有效方法（英语：），包含一系列定义清晰的指令，并可于有限的时间及空间内清楚的表述出来。算法中的指令描述的是一个计算，它执行（英语：）時从一个初始状态和初始输入（可能为空）开始，经过一系列**有限**而清晰定义的状态最终产生**输出**并**停止**于一个终态。 一个状态到另一个状态的转移不一定是确定的。 包括随机化算法在内的一些算法，都包含了一些随机输入。

历史
--

算法在中国古代文献中称为"术"，最早出现在《周髀算經》、《九章算术》。特别是《九章算术》，给出四则运算、最大公约数、最小公倍数、开平方根、开立方根、求素数的埃氏篩，线性方程组求解的高斯消元法。三国時代的刘徽给出求圆周率的算法：刘徽割圆术。

自唐代以来，历代更有许多专门论述""的专著：

* 唐代：《一位》 一卷，《》 一卷；
* 宋代：《绪论》 一卷、《秘诀》 一卷；最著名的是杨辉的《杨辉》；
* 元代：《》；
* 明代：程大位 《统宗》
* 清代：《开平》、《一得》、《全书》。

而英文名稱「algorithm」来自于9世纪波斯数学家花拉子米（比阿勒·霍瓦里松，波斯語：‎，拉丁轉寫：al-Khwarizmi），因為比阿勒·霍瓦里松在数学上提出了算法这个概念。「算法」原为「algorism」，即"al-Khwarizmi"的音转，意思是"花剌子模"的运算法则，在18世纪演变为「algorithm」。

欧几里得算法被人们认为是史上第一个算法。

第一次编写程序是愛達·勒芙蕾絲（）于1842年为巴贝奇分析机编写求解解伯努利微分方程的程序，因此愛達·勒芙蕾絲被大多数人认为是世界上第一位程序员。因为查尔斯·巴贝奇（）未能完成他的巴贝奇分析机，这个算法未能在巴贝奇分析机上执行。
因为「well-defined procedure」缺少数学上精确的定义，19世纪和20世纪早期的数学家、逻辑学家在定义算法上出现了困难。20世纪的英国数学家图灵提出了著名的图灵论题，并提出一种假想的电脑的抽象模型，这个模型被称为图灵机。图灵机的出现解决了算法定义的难题，图灵的思想对算法的发展起到了重要的作用。

特征
--

以下是高德纳在他的著作《计算机程序设计艺术》里对演算法的特征归纳：

1. 输入：一个算法必须有零个或以上输入量。
2. 输出：一个算法应有一个或以上输出量，输出量是算法计算的结果。
3. 明确性：算法的描述必须无歧义，以保证算法的实际执行结果是精确地符合要求或期望，通常要求实际执行结果是确定的。
4. 有限性：依据图灵的定义，一个演算法是能够被任何图灵完备系统模拟的一串运算，而图灵机有有限个状态、有限个输入符号和有限个转移函数（指令）。而一些定义更规定演算法必须在有限个步骤内完成任务。
5. 有效性：又称可行性。能够实现，算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现。

基本要素
----

算法的核心是建立问题抽象的模型和明确求解目标，之后可以根据具体的问题选择不同的模式和方法完成算法的设计。

### 常用设计模式

完全遍历法和不完全遍历法：在问题的解是有限离散解空间，且可以验证正确性和最优性时，最简单的算法就是把解空间的所有元素完全遍历一遍，逐个检测元素是否是我们要的解。这是最直接的算法，实现往往最简单。但是当解空间特别庞大时，这种算法很可能导致工程上无法承受的计算量。这时候可以利用不完全遍历方法——例如各种搜索法和规划法——来减少计算量。
分治法：把一个问题分割成互相独立的多个部分分别求解的思路。这种求解思路带来的好处之一是便于进行并行计算。
动态规划法：当问题的整体最优解就是由局部最优解组成的时候，经常采用的一种方法。贪婪算法：常见的近似求解思路。当问题的整体最优解不是（或无法证明是）由局部最优解组成，且对解的最优性没有要求的时候，可以采用的一种方法。
线性规划法：见条目。
简并法：把一个问题通过逻辑或数学推理，简化成与之等价或者近似的、相对简单的模型，进而求解的方法。

### 常用实现方法

递归方法与迭代方法
顺序计算、并行计算和分布式运算：顺序计算就是把形式化算法用程序设计语言进行单线程序列化后执行。
确定性算法和非确定性算法
精确求解和近似求解

形式化算法
-----

算法是电脑处理信息的本质，因为计算机程序本质上是一个算法来告诉电脑确切的步骤来执行一个指定的任务，如计算职工的薪水或打印学生的成绩单。一般地，当算法在处理信息时，会从输入装置或数据的存储地址读取数据，把结果写入输出设备或某个存储地址供以后再调用。

复杂度
---

### 时间复杂度

算法的时间复杂度是指算法需要消耗的时间资源。一般来说，电脑算法是问题规模{\displaystyle n}的函数**解析失败 (语法错误): {\displaystyle f（n）}**
，算法的时间复杂度也因此记做
：**解析失败 (语法错误): {\displaystyle T（n）= \mathcal{O}（f（n））}**

算法执行时间的增长率与**解析失败 (语法错误): {\displaystyle f（n）}**
的增长率正相关，称作渐近时间复杂度（英语：），简称时间复杂度。
常见的时间复杂度有：常数阶**解析失败 (语法错误): {\displaystyle O（1）}**
，对数阶**解析失败 (语法错误): {\displaystyle O（\log n）}**
，线性阶**解析失败 (SVG（MathML可通过浏览器插件启用）：从服务器"http://localhost:6011/zh.wikipedia.org/v1/"返回无效的响应（"Math extension cannot connect to Restbase."）：): {\displaystyle O（n）}**
，线性对数阶**解析失败 (语法错误): {\displaystyle O（n\log n）}**
，平方阶**解析失败 (语法错误): {\displaystyle O（n^2）}**
，立方阶**解析失败 (语法错误): {\displaystyle O（n^3）}**
，…，< math> k </math>次方阶**解析失败 (语法错误): {\displaystyle O（n^k）}**
，指数阶**解析失败 (语法错误): {\displaystyle O（2^n）}**
。随着问题规模{\displaystyle n}的不断增大，上述时间复杂度不断增大，算法的执行效率越低。

### 空间复杂度

算法的空间复杂度是指算法需要消耗的空间资源。其计算和表示方法与时间复杂度类似，一般都用复杂度的渐近性来表示。同时间复杂度相比，空间复杂度的分析要简单得多。

非确定性多项式时间（NP）
-------------

条目：NP（复杂度）

实现
--

算法不单单可以用计算机程序来实现，也可以在人工神经网络、电路或者机械设备上实现。

示例
--

### 求最大值演算法

这是算法的一个简单的例子。
我们有一串随机数列。我们的目的是找到这个数列中最大的数。如果将数列中的每一个数位看成是一颗豆子的大小，可以将下面的算法形象地称为「捡豆子」：

1. 首先将第一颗豆子放入口袋中。
2. 从第二颗豆子开始检查，如果正在检查的豆子比口袋中的还大，则将它捡起放入口袋中，同时丢掉原先口袋中的豆子。反之则继续下一颗豆子。直到最后一颗豆子。
3. 最后口袋中的豆子就是所有的豆子中最大的一颗。以上算法在中国大陆的教科书中通常被叫做"打擂法"或者"循环打擂"：在一个for循环中，每轮循环都有新的挑战者。若挑战者胜的话，挑战者做新擂主，否则擂主卫冕。for循环结束后输出最后的擂主。

下面是一个形式算法，用ANSI C代码表示

```
int max（int \*array, int size）
{
 int mval = \*array;
 int i;
 for （i = 1; i < size; i++）
 if （array[i] > mval）
 mval = array[i];
 return mval;
}

```

### 求最大公約數演算法

求两个自然数的最大公约数
设两个变量{\displaystyle M}和{\displaystyle N}

1. 如果{\displaystyle M<N}，则交换{\displaystyle M}和{\displaystyle N}
2. {\displaystyle M}除以{\displaystyle N}，得到余数{\displaystyle R}
3. 判断{\displaystyle R=0}，正确则{\displaystyle N}即为"最大公约数"，否则下一步
4. 将{\displaystyle N}赋值给{\displaystyle M}，将{\displaystyle R}赋值给{\displaystyle N}，重做第一步。

用ANSI C代码表示

```
//交換2數
void swapi（int \*x, int \*y）
{
 int tmp = \*x;
 \*x = \*y;
 \*y = tmp;
}

int gcd（int m, int n）
{
 int r;
 do
 {
 if （m < n）
 swapi（&m, &n）;
 r = m % n;
 m = n;
 n = r;
 } while （r）;
 return m;
}

```

利用if函式以及遞迴則能做出更為精簡的程式碼，更可省去交換的麻煩。（但是也因為遞迴呼叫，其空間複雜度提高）

```
int gcd（int a,int b）
{
 if（a%b）
 return gcd（b,a%b）;
 return b;
}

```

分类
--

分类算法有多种方法，每种方法都有自己的优点。

### 通过实施

分类算法的一种方法是通过实现手段。

|  |
| --- |
| 
```
int gcd（int A, int B） {
 if （B == 0）
 return A;
 else if （A > B）
 return gcd（A-B,B）;
 else
 return gcd（A,B-A）;
}

```
 |
| 从上面的流程图递归 C 实现欧几里得算法 |

递归
递归算法是一种重复调用（引用）自身的算法，直到某个条件（也称为终止条件）匹配，这是函数式编程常用的方法。迭代算法使用循环之类的重复构造，有时使用堆栈之类的附加数据结构来解决给定的问题。有些问题自然适合于这种或那种实现。例如，使用递归实现可以很好地理解河内的塔。每个递归版本都有一个等价的（但可能或多或少复杂）迭代版本，反之亦然。
串联的、平行的或分布的
算法通常是在假设计算机一次执行一条算法指令的情况下讨论的。那些计算机有时被称为串行计算机。针对这种环境设计的算法称为串行算法，而不是并行算法或分布式算法。并行算法是利用计算机体系结构的算法，其中多个处理器可以同时处理一个问题。分布式算法是使用与计算机网络连接的多台机器的算法。并行和分布式算法将问题划分为更加对称或不对称的子问题，并将结果收集在一起。例如，CPU 就是并行算法的一个例子。这种算法的资源消耗不仅是每个处理器上的处理器周期，而且是处理器之间的通信开销。有些排序算法可以有效地并行化，但是它们的通信开销很大。迭代算法通常是可并行的，但有些问题没有并行算法，称为固有的串行问题。
确定的或不确定的
确定性算法在算法的每一步都用精确的决策来解决问题，而非确定性算法通过猜测来解决问题，虽然通过启发式使典型的猜测更加精确。
精确的或近似的
虽然许多算法达到一个精确的解决方案，近似算法寻求一个近似，更接近真正的解决方案。这种近似可以通过使用确定性策略或随机策略来实现。这些算法对许多难题都有实用价值。近似算法的一个例子是背包问题，其中有一组给定的项目。它的目标是包装背包，以获得最大的总价值。每个物品都有一定的重量和价值。可携带的总重量不超过某个固定数字 X，因此，解决方案必须考虑物品的重量及其价值。
量子算法
量子算法运行在一个现实的量子计算模型上。这个术语通常用于那些本质上似乎是量子的算法，或者使用量子计算的一些基本特性，如态叠加原理或量子纠缠。
### 通过设计范例

对算法进行分类的另一种方法是通过它们的设计方法或范例。有一定数量的范例，每一个不同于其他。此外，这些类别中的每一个都包括许多不同类型的算法。一些常见的范例是:

暴力搜查或彻底搜查
蛮力是一种解决问题的方法，包括系统地尝试每一种可能的选择，直到找到最佳解决方案。这种方法可能非常耗时，因为它需要遍历所有可能的变量组合。但是，当其他方法不可用或过于复杂时，常常使用这种方法。蛮力可以用来解决各种问题，包括寻找两点之间的最短路径和破解密码。
各个击破
分而治之的算法重复地将一个问题的实例减少为同一个问题的一个或多个更小的实例（通常是递归的） ，直到这些实例足够小以便于解决。分而治之的一个例子是合并排序。在将数据分割成片段后，可以对每个片段进行排序，在征服阶段通过合并片段可以对整个数据进行排序。一种更简单的分而治之的算法称为减而治算法，它解决一个相同的子问题，并使用这个子问题的解决方案来解决更大的问题。分治算法将问题划分为多个子问题，因此分治阶段比减少分治算法复杂。递减和征服算法的一个例子是二进制搜索算法。
搜索和枚举
许多问题（比如下棋）可以建模为图形上的问题。图探索算法规定了在图中移动的规则，对于这类问题非常有用。这一类别还包括搜索算法、分支和界枚举以及回溯。
随机算法
这样的算法随机（或伪随机）做出一些选择。它们可以非常有用地找到近似解决方案的问题，找到精确的解决方案可能是不切实际的（见下面的启发式方法）。对于其中的一些问题，我们知道最快的近似必须包含一些随机性。 对于某些问题，具有多项式时间复杂度的随机算法能否成为最快的算法，是一个被称为" P/NP问题"的悬而未决的问题。这种算法有两大类:
1. 蒙特卡罗算法以高概率返回正确答案。例如 RP 是这些运行在多项式时间的子类。
2. 拉斯维加斯算法总是返回正确的答案，但他们的运行时间只是概率约束，例如 ZPP。

降低复杂性
这种技术涉及到通过将一个困难问题转化为一个更广为人知的问题来解决它，我们（希望）已经有了渐近最优算法。目标是找到一种复杂度不受所得到的简化算法控制的简化算法。例如，一种用于在未排序列表中查找中值的选择算法首先对列表进行排序（代价较高的部分） ，然后取出排序列表中的中间元素（代价较低的部分）。这种技术也被称为转换和征服。
反向追踪
在这种方法中，多个解决方案是逐步构建的，当确定它们不能生成有效的完整解决方案时，就会放弃这些解决方案。
### 优化问题

对于最优化问题，有一个更具体的算法分类; 这类问题的算法可能属于上述一个或多个一般类别，也可能属于以下类别之一:

线性规划
当搜索受线性等式和不等式约束的线性函数的最优解时，该问题的约束可以直接用于产生最优解。有一些算法可以解决这类问题，比如流行的单纯形法。 线性规划可以解决的问题包括有向图的最大流问题。如果一个问题额外要求一个或多个未知数必须是一个整数，那么它被分类为整数规划。一个线性规划算法可以解决这样的问题，如果它可以证明所有的限制整数值是表面的，即，解决方案满足这些限制。在一般情况下，根据问题的难度，使用专门的算法或找到近似解的算法。
动态编程
当一个问题显示出最优子结构ーー意味着一个问题的最优解可以从子问题的最优解构造出来ーー和重叠子问题，意味着同一个子问题可以用来解决许多不同的问题实例时，一种叫做动态规划的快速方法可以避免重新计算已经计算出来的解。例如，Floyd-Warshall 算法，在一个加权图中，通过使用从所有相邻顶点到达目标的最短路径，可以找到从一个顶点到达目标的最短路径。动态编程和制表一起使用。动态规划与分治的主要区别在于子问题在分治中或多或少是独立的，而子问题在动态规划中是重叠的。动态编程和简单递归的区别在于递归调用的缓存或制表。当子问题是独立的并且没有重复时，制表不起作用; 因此动态编程不是所有复杂问题的解决方案。通过使用制表法或维护已经解决的子问题表，动态规划将许多问题的指数性质降低到多项式复杂度。
贪婪的方法
贪婪算法类似于动态规划算法，它通过检查子结构来工作，在这种情况下，不是检查问题，而是检查给定的解。这种算法从某种解开始，这种解可能已经给出或已经以某种方式构造出来，然后通过小的修改对其进行改进。对于一些问题，他们可以找到最优解，而对于其他问题，他们停留在局部最优，也就是说，在解决方案，不能改进的算法，但不是最优的。贪婪算法最常用的用途是寻找最小生成树，在这种方法中可以找到最优解。霍夫曼树，克鲁斯卡尔，普里姆，Sollin 是贪婪的算法，可以解决这个最佳化问题。
启发式方法
在优化问题中，如果不能找到最优解，可以使用启发式算法来寻找接近最优解的解。这些算法的工作原理是随着它们的进展越来越接近最优解。原则上，如果运行无限长的时间，他们会找到最优解。它们的优点是能够在相对较短的时间内找到一个非常接近最优解的解。这些算法包括本地搜索、禁忌搜索、模拟退火搜索和遗传算法。其中一些算法，如模拟退火，是非确定性算法，而其他的，如禁忌搜索，是确定性的。当非最优解的误差界限已知时，该算法进一步被归类为近似演算法。
### 通过研究领域

每个科学领域都有自己的问题，需要高效的算法。一个领域中的相关问题经常被一起研究。一些示例类是搜索算法、排序算法、合并算法、数值算法、图形算法、字符串算法、计算几何算法、组合算法、医学算法、机器学习、密码学、数据压缩算法和解析技术。

字段之间往往相互重叠，一个字段的算法进步可能会改进其他字段的算法，有时候这些字段完全不相关。例如，动态规划是为了优化工业中的资源消耗而发明的，但是现在被用于解决许多领域中的广泛问题。

### 通过复杂性

算法可以根据它们需要完成的时间和它们的输入大小进行分类:

* 常数时间: 如果算法所需的时间相同，则不管输入大小如何。例如，对数组元素的访问。
* 对数时间: 如果时间是输入大小的对数函数。二进制搜索算法。
* 线性时间: 如果时间与输入大小成正比。列表的遍历。
* 多项式时间: 如果时间是输入大小的幂次。例如，气泡排序算法具有二次时间复杂度。
* EXPTIME: 如果时间是输入大小的指数函数。例如暴力搜索法。

一些问题可能有多个不同复杂度的算法，而另一些问题可能没有算法或者没有已知的有效算法。还有从一些问题到其他问题的映射。由于这个原因，我们发现根据问题的最佳可能算法的复杂性，将问题本身分类比将算法分为等价类更为合适。

### 连续算法

形容词"连续"用于"算法"一词时，可以表示:

* 对表示连续数量的数据进行操作的算法，即使这些数据是由离散近似表示的ーー这种算法是在数值分析中研究的; 或
* 一种微分方程形式的算法，在模拟计算机上运行，不断地对数据进行操作。

* 基本算法
	+ 枚举
	+ 搜索
		- 深度优先搜索
		- 广度优先搜索
		- 
		- 遗传算法
* 数据结构的算法
* 数论与代数算法
* 计算几何的算法
	+ 凸包算法
* 图论的算法
	+ 哈夫曼编码
	+ 树的遍历
	+ 最短路径算法
	+ 最小生成树算法
	+ 最小树形图
	+ 网络流算法
	+ 匹配算法
	+ 分團問題
* 动态规划
* 其他
	+ 数值分析
	+ 加密算法
	+ 排序算法
	+ 检索算法
	+ 随机化算法
	+ 关于并行算法，请参阅并行计算一文。

註釋
--

1. ↑  Thomas H. Cormen; Charles E. Leiserson; Ronald L. Rivest; Clifford Stein; 殷建平等译..  原书第3版. 北京: 机械工业出版社. 2013年1月: 3[5]  [2017-11-14]. ISBN 978-7-111-40701-0 （中文）.  引文使用过时参数`coauthors` (帮助)
2. ↑  David A.Grossman，Ophir Frieder，"信息检索：算法和启发式"，2004年第2版，ISBN 1402030045
3. ↑  Kleene（斯蒂芬·科尔·克莱尼）1943 in Davis 1965:274
4. ↑  Rosser（巴克利·羅瑟）1939 in Davis 1965:225
5. ↑  Moschovakis, Yiannis N.. Engquist, B.; Schmid, W. (编).. Springer. 2001: 919–936 （Part II）  [2012-09-27]. （原始内容存档于2021-04-24）.
6. ↑  Well defined with respect to the agent that executes the algorithm: "There is a computing agent, usually human, which can react to the instructions and carry out the computations"（Rogers 1987:2）.
7. ↑  "Any classical mathematical algorithm, for example, can be described in a finite number of English words"（Rogers 1987:2）.
8. ↑  "An algorithm has zero or more inputs, i.e. quantities which are given to it initially before the algorithm begins"（Knuth 1973:5）
9. ↑  "A procedure which has all the characteristics of an algorithm except that it possibly lacks finiteness may be called a 'computational method'"（Knuth 1973:5）
10. ↑  "An algorithm has one or more outputs, i.e. quantities which have a specified relation to the inputs"（Knuth 1973:5）
11. ↑  Whether or not a process with random interior processes （not including the input） is an algorithm is debatable. Rogers opines that: "a computation is carried out in a discrete stepwise fashion, without use of continuous methods or analogue devices... carried forward deterministically, without resort to random methods or devices, e.g. dice" Rogers 1987:2）.
12. ↑  Whether or not a process with random interior processes （not including the input） is an algorithm is debatable. Rogers opines that: "a computation is carried out in a discrete stepwise fashion, without use of continuous methods or analogue devices ... carried forward deterministically, without resort to random methods or devices, e.g. dice" Rogers 1987:2）.
13. ↑ . The Guardian. 10 December 2012  [10 December 2012]. （原始内容存档于2018-12-25）.
14. ↑ . 读书频道-IT技术图书-51CTO.COM.  [2017-06-07]. （原始内容存档于2017-03-24）.
15. ↑ . 湖南科技大学程序设计在线评测（Online Judge）. [永久]
16. ↑ . 在点网.  [2017-06-07]. （原始内容存档于2019-06-03）.
17. ↑  Kellerer, Hans; Pferschy, Ulrich; Pisinger, David.. Springer. 2004  [September 19, 2017]. ISBN 978-3-540-40286-2. doi:10.1007/978-3-540-24777-7. （原始内容存档于October 18, 2017） （英语）. Kellerer, Hans; Pferschy, Ulrich; Pisinger, David （2004）. *Knapsack Problems | Hans Kellerer | Springer*. Springer. doi:10.1007/978-3-540-24777-7. ISBN 978-3-540-40286-2. S2CID 28836720. Archived from the original on October 18, 2017. Retrieved September 19, 2017.
18. ↑  For instance, the volume of a convex polytope （described using a membership oracle） can be approximated to high accuracy by a randomized polynomial time algorithm, but not by a deterministic one: see Dyer, Martin; Frieze, Alan; Kannan, Ravi.. J. ACM. January 1991, **38** (1): 1–17. CiteSeerX 10.1.1.145.4600 可免费查阅. S2CID 13268711. doi:10.1145/102782.102783. Dyer, Martin; Frieze, Alan; Kannan, Ravi （January 1991）. "A Random Polynomial-time Algorithm for Approximating the Volume of Convex Bodies". *J. ACM*. **38** （1）: 1–17. CiteSeerX 10.1.1.145.4600. doi:10.1145/102782.102783. S2CID 13268711.
19. ↑  
George B. Dantzig and Mukund N. Thapa. 2003. *Linear Programming 2: Theory and Extensions*. Springer-Verlag.
20. ↑  Tsypkin.. Academic Press. 1971: 54. ISBN 978-0-08-095582-7. Tsypkin （1971）. *Adaptation and learning in automatic systems*. Academic Press. p. 54. 国际标准书号 978-0-08-095582-7.

外部链接
----

|  |  |
| --- | --- |
|  | 维基词典中的词条「」。 |

算法库
* 石溪算法库 – 石溪大学
* 收集的ACM算法 – 计算机协会
* 斯坦福图形库 的存檔，存档日期December 6, 2015，. – 史丹佛大學

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
应用数学 |
| --- |
|  |
| 运算数学 | 
* 算法
	+ 算法设计
	+ 算法分析
* 自動機理論
* 自动化定理证明
* 编码理论
* 计算几何
* 约束满足
	+ 约束编程
* 计算机逻辑
* 密码学
* 信息论
* 计算统计学

 |
|  |
| 离散数学 | 
* 计算机代数
* 计算数论
* 组合数学
* 图论
* 离散几何学

 |
|  |
| 数学分析 | 
* 逼近理论
* 克利福德分析（英语：）
	+ 克利福德代数
* 微分方程
	+ 常微分方程
	+ 偏微分方程
	+ 随机微分方程
* 微分几何
	+ 微分形式
	+ 规范理论 (数学)（英语：）

* + 几何分析（英语：）
* 动力系统
	+ 混沌理论
	+ 控制理论
* 泛函分析
	+ 算子代数
	+ 算子理论
* 调和分析
	+ 傅里叶分析
* 多重线性代数
	+ 外代数
	+ 几何代数
	+ 张量
	+ 向量代数

* 多元微积分
	+ 外微积分
	+ 几何微积分（英语：）
	+ 张量微积分（英语：）
	+ 向量微积分
* 数值分析
	+ 数值线性代数
	+ 常微分方程数值方法
	+ 偏微分方程数值方法
* 变分法

 |
|  |
| 概率论 | 
* 概率分布（随机变量）
* 随机过程 / 随机分析
* 泛函积分
* 马利阿温微积分（英语：）

 |
|  |
| 数学物理 | 
* 分析力学
	+ 拉格朗日力学
	+ 哈密顿力学
* 场论
	+ 经典场论
	+ 共形场论
	+ 有效场论
	+ 规范场论
	+ 量子场论
	+ 统计场论
	+ 拓扑量子场论
* 摄动理论
	+ 微扰理论 (量子力学)
* 位势论
* 弦理论
	+ 玻色弦理论
	+ 拓扑弦论
* 超对称
	+ 超对称量子力学（英语：）
	+ 随机力学超对称理论（英语：）

|  |  |
| --- | --- |
| 代数结构 | 
* 物理空间代数
* 路径积分表述
* 泊松代数
* 量子群
* 重整化群
* 粒子物理与表示论（英语：）
* 时空代数
* 超代数
* 超对称代数（英语：）

 |

 |
|  |
| 决策论 | 
* 博弈论
* 运筹学
* 最优化
* 社会选择理论
* 统计学
* 数理经济学
* 数理金融学

 |
|  |
| 其他应用 | 
* 数理生物学
* 数学化学（英语：）
* 数学心理学
* 数理社会学

 |
|  |
| 相关领域 | 
* 数学
* 数学软件

 |
|  |
| 社会组织 | 
* 工业与应用数学学会（英语：）
	+ 日本应用数理学会（英语：）
* 法国应用与工业数学学会（英语：）
* 国际工业与应用数学理事会（英语：）

 |
|  |
| 
* **分类**
* 话题

 |

 |

参考书目
----

参考文献
----

* Rogers, Jr, Hartley.. The MIT Press. 1987. ISBN 0-262-68052-1.
* Davis, Martin.. New York: Raven Press. 1965. ISBN 0-486-43228-9.  Davis此書中有列出許多相關的論文，包括哥德尔、邱奇、图灵、巴克利·羅瑟（英语：）、斯蒂芬·科尔·克莱尼及埃米爾·波斯特（英语：）的論文。在參考文獻中也會列出原作者的姓名。

参閱
--

* 计算机科学主题
* icon计算机程序设计主题

* 抽象机器
* 算法作曲
* 高级综合
* 垃圾进，垃圾出
* 《算法导论》
* 计算理论
	+ 可计算性理论
	+ 计算复杂性理论

延伸阅读
----

[在维基数据编辑]

维基文库中的相关文本： 《欽定古今圖書集成·曆象彙編·曆法典·算法部》，出自陈梦雷《古今圖書集成》
外部链接
----

* 20世纪十大算法 （页面存档备份，存于）
* 演算法笔记 （页面存档备份，存于）
* 计算几何算法概览 （页面存档备份，存于）


|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
算法 |
| --- |
|  |
| 排序 | 

|  |  |
| --- | --- |
| 比较排序 | 
* 冒泡排序
* 选择排序
* 插入排序
* 希尔排序
* 快速排序
* 归并排序
* 堆排序
* 鸡尾酒排序
* 梳排序
* 侏儒排序
* 图书馆排序
* 内省排序
* 奇偶排序

 |
|  |
| 线性时间排序 | 
* 鸽巢排序
* 基数排序
* 計數排序
* 桶排序

 |
|  |
| 并行排序 | 
* 排序网络（英语：）
* Batcher归并网络

 |
|  |
| 不实用的 | 
* Bogo排序
* 臭皮匠排序

 |
|  |
| 图 | 
* 拓撲排序

 |

 |
|  |
| 搜索 | 

|  |  |
| --- | --- |
| 列表 | 
* 线性搜索
* 二分搜索
* 插值搜尋

 |
|  |
| 树・图 | 
* 广度优先搜索
	+ 最良優先搜索（英语：）
	+ 均一开销搜索
	+ A\*
* 深度优先搜索
	+ 迭代深化深度优先搜索
	+ 深度限制搜索（日语：）
	+ 双向搜索
* 分枝限定法（英语：）

 |
|  |
| 字符串 | 
* KMP算法
* 博耶-穆尔字符串搜索算法
* AC自动机算法
* 拉宾-卡普算法
* bitap算法

 |

 |
|  |
| 最短路问题 | 
* 戴克斯特拉算法
* 贝尔曼-福特算法
* A\*搜尋演算法
* Floyd-Warshall算法

 |
|  |
| 最小生成树 | 
* 普林姆算法
* 克鲁斯克尔演算法

 |
|  |
| 最大流最小割 | 
* 福特-富尔克森算法
* 埃德蒙兹-卡普算法
* 迪尼茨算法

 |
|  |
| 线性规划 | 
* 单纯形法
* 卡马卡尔算法（英语：）

 |
|  |
| 順序統計量 | 
* 选择算法
* 中位数的中位数（英语：）

 |
|  |
| 種類 | 
* 精确算法
* 近似算法
* 随机化算法

 |
|  |
| 其他 | 
* 分治法
* 动态规划
* 贪心算法

 |
|  |
| **Category:算法** |

 |

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
计算机科学的主要领域 |
| --- |
|  |
| 注：该模板大致遵循ACM 电脑分类系统。 |
|  |
| 计算机硬件 | 
* 印刷电路板
* 外部设备
* 集成电路
* 超大规模集成电路
* 绿色计算
* 電子設計自動化

 |
|  |
| 系统架构组织 | 
* 電腦系統架構
* 嵌入式系统
* 实时计算

 |
|  |
| 网络 | 
* 网络传输协议
* 路由
* 网络拓扑
* 网络服务

 |
|  |
| 软件组织 | 
* 直譯器
* 中间件
* 虛擬機器
* 操作系统
* 软件质量

 |
|  |
| 软件符号和工具 | 
* 编程范型
* 编程语言
* 編譯器
* 领域特定语言
* 軟體框架
* 集成开发环境
* 软件配置管理
* 函式庫

 |
|  |
| 软件开发 | 
* 软件开发过程
* 需求分析
* 软件设计
* 软件部署
* 軟體維護
* 开源模式

 |
|  |
| 计算理论 | 
* 自动机
* 可计算性理论
* 計算複雜性理論
* 量子计算
* 数值计算方法
* 计算机逻辑
* 形式语义学

 |
|  |
| 算法 | 
* 算法分析
* 算法设计
* 算法效率
* 随机化算法
* 计算几何

 |
|  |
| 计算数学 | 
* 离散数学
* 信息与计算科学
* 统计学
* 数学软件
* 数理逻辑
* 集合论
* 数论
* 图论
* 类型论
* 范畴论
* 信息论
* 数值分析
* 数学分析

 |
|  |
| 信息系统 | 
* 数据库管理系统
* 電腦數據
* 企业信息系统（英语：）
* 社会性软件
* 地理信息系统
* 决策支持系统
* 过程控制
* 数据挖掘
* 數位圖書館
* 系统平台
* 數位行銷
* 万维网
* 信息檢索

 |
|  |
| 安全 | 
* 密码学
* 形式化方法
* 入侵检测系统
* 网络安全
* 信息安全

 |
|  |
| 人机交互 | 
* 计算机辅助功能
* 用户界面
* 可穿戴计算机
* 普适计算
* 虚拟现实
* 聊天機器人

 |
|  |
| 并发性 | 
* 并发计算
* 并行计算
* 分布式计算
* 多线程
* 多元處理

 |
|  |
| 人工智能 | 
* 自动推理
* 计算语言学
* 计算机视觉
* 进化计算
* 专家系统
* 自然语言处理
* 机器人学

 |
|  |
| 机器学习 | 
* 監督式學習
* 無監督學習
* 强化学习
* 交叉驗證

 |
|  |
| 计算机图形学 | 
* 计算机动画
* 可视化
* 渲染
* 修飾照片
* 圖形處理器
* 混合现实
* 虚拟现实
* 图像处理
* 图像压缩
* 实体造型

 |
|  |
| 应用计算 | 
* 电子商务
* 企业级软件
* 计算数学
* 计算物理学
* 计算化学
* 计算生物学
* 計算社會科學
* 医学信息学
* 数字艺术
* 電子出版
* 網絡戰
* 电子游戏
* 文字处理器
* 運籌學
* 教育技术学
* 生物信息学
* 认知科学
* 文件管理系统（英语：）

 |
|  |
| 
* 分类 **分类**
* 主题 **主题**
* 专题**专题**
* 共享资源页面 **维基共享**

 |

 |

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
应用数学 |
| --- |
|  |
| 运算数学 | 
* 算法
	+ 算法设计
	+ 算法分析
* 自動機理論
* 自动化定理证明
* 编码理论
* 计算几何
* 约束满足
	+ 约束编程
* 计算机逻辑
* 密码学
* 信息论
* 计算统计学

 |
|  |
| 离散数学 | 
* 计算机代数
* 计算数论
* 组合数学
* 图论
* 离散几何学

 |
|  |
| 数学分析 | 
* 逼近理论
* 克利福德分析（英语：）
	+ 克利福德代数
* 微分方程
	+ 常微分方程
	+ 偏微分方程
	+ 随机微分方程
* 微分几何
	+ 微分形式
	+ 规范理论 (数学)（英语：）

* + 几何分析（英语：）
* 动力系统
	+ 混沌理论
	+ 控制理论
* 泛函分析
	+ 算子代数
	+ 算子理论
* 调和分析
	+ 傅里叶分析
* 多重线性代数
	+ 外代数
	+ 几何代数
	+ 张量
	+ 向量代数

* 多元微积分
	+ 外微积分
	+ 几何微积分（英语：）
	+ 张量微积分（英语：）
	+ 向量微积分
* 数值分析
	+ 数值线性代数
	+ 常微分方程数值方法
	+ 偏微分方程数值方法
* 变分法

 |
|  |
| 概率论 | 
* 概率分布（随机变量）
* 随机过程 / 随机分析
* 泛函积分
* 马利阿温微积分（英语：）

 |
|  |
| 数学物理 | 
* 分析力学
	+ 拉格朗日力学
	+ 哈密顿力学
* 场论
	+ 经典场论
	+ 共形场论
	+ 有效场论
	+ 规范场论
	+ 量子场论
	+ 统计场论
	+ 拓扑量子场论
* 摄动理论
	+ 微扰理论 (量子力学)
* 位势论
* 弦理论
	+ 玻色弦理论
	+ 拓扑弦论
* 超对称
	+ 超对称量子力学（英语：）
	+ 随机力学超对称理论（英语：）

|  |  |
| --- | --- |
| 代数结构 | 
* 物理空间代数
* 路径积分表述
* 泊松代数
* 量子群
* 重整化群
* 粒子物理与表示论（英语：）
* 时空代数
* 超代数
* 超对称代数（英语：）

 |

 |
|  |
| 决策论 | 
* 博弈论
* 运筹学
* 最优化
* 社会选择理论
* 统计学
* 数理经济学
* 数理金融学

 |
|  |
| 其他应用 | 
* 数理生物学
* 数学化学（英语：）
* 数学心理学
* 数理社会学

 |
|  |
| 相关领域 | 
* 数学
* 数学软件

 |
|  |
| 社会组织 | 
* 工业与应用数学学会（英语：）
	+ 日本应用数理学会（英语：）
* 法国应用与工业数学学会（英语：）
* 国际工业与应用数学理事会（英语：）

 |
|  |
| 
* **分类**
* 话题

 |

 |

|  |  |  |
| --- | --- | --- |
| 

|  |  |
| --- | --- |
| 规范控制 編輯維基數據鏈接 | 
* AAT: 300065585
* BNE: XX527980
* BNF: cb119358199 (data)
* FAST: 805020
* GND: 4001183-5
* J9U: 987007293927505171
* LCCN: sh85003487
* NDL: 00560337
* NKC: ph114026

 |

 |