基础与复杂度

算法

算法就是一份菜谱:一串清晰、毫不含糊的有限步骤,把某个输入变成你想要的答案。一份烹饪菜谱拿食材换来一顿饭;地图软件里的路线把两个地址换成一步步的导航;你在学校学的竖式除法把两个数换成一个商。每一种情形里,步骤都精确到任何人——或任何计算机——只要忠实照做,都会得到同样的结果。这份「忠实」正是要害所在:算法是一个想法,被写得如此朴素直白,以至于不再需要一个聪明的人去揣摩它的意思。

要算得上算法,一个过程通常必须是确定的(每一步都精确无误,不能有「这里随便看着办」)、有穷的(在有限步之后会停下,而不是永远跑下去)、可执行的(每一步都是你真能动手做出来的)。它还要有明确的输入和明确的输出。请注意算法与任何一份具体程序是分开的:同一个归并排序算法,可以用 C++、Python 写,也可以写在纸上。代码只是算法的一种表达;算法是代码背后的策略。

我们为什么要计较这个区别?因为大多数有意思的问题都有许多算法,它们全都能给出正确答案,但随着输入变大,所需的时间和内存却可能天差地别。选得好——并能证明你的选择既正确又高效——正是这整门学科的核心。我们用渐近分析的工具(见大 O 记号)来分析一个算法的运行时间和空间,正是为了能比较两份都正确的菜谱,挑出那份在输入变大时仍能跑完的。

得名自 9 世纪数学家花拉子米(al-Khwarizmi)。算法是策略;程序则是它在某种具体语言中的一种写法。

又称
proceduremethod算法演算法