本文转自豆瓣_燃烧的影子
图灵机与可计算性
图灵(1912~1954)出生于英国伦敦,19岁进入剑桥皇家学院研究量子力学和数理逻辑。1935年,图灵写出了“论高斯误差函数”的论文,因此他从一名学生直接成为学院的研究员,并开始了“可计算性”研究。1936年4月,图灵发表了“可计算数及其在判定问题上的一个应用”的论文,形成了“图灵机”的重要思想。用反证法证明,任何可计算其值的函数都存在相应的图灵机;反之,不存在相应图灵机的函数就是不具有可计算其函数值算法的函数。同年,图灵到美国普林斯顿大学学习,并于1938年获该校博士学位。1939年秋,图灵应召到英国外交部通信处从事密码破译工作,开始了最早的计算机的研究工作。战后图灵一直从事计算机的理论研究和实践开发研究,制作出最早的电子计算机。他于1950年发表了“计算机和潜力”的论文,引发了“机器是否会思考”的学术讨论,并成为影响至今的经典论著。图灵思想活跃,但性格内向,一直没有结婚。1954年6月,图灵在家中因氰化钾中毒去世,原因则众说纷纭,至今仍为一个谜。
“算法”(Algorithm)这个名称最早源于9世纪阿拉伯数学家花拉子米的一本著作,在这本著作中花拉子米用算法来概括算术四则运算的法则。20世纪初,希尔伯特提出了著名的23个数学问题,其中很多都涉及到问题解决的判定问题。1935年,正在剑桥皇家学院读书的图灵,在听了数理逻辑学家纽曼的课程后,开始注意希尔伯特的判定问题,并进行了潜心的研究。该问题要求判定是否存在一种有效的算法(或今天在计算机科学中称为“程序”的东西),把某个结论从一组给定的假设中用逻辑方法推演出来。图灵将算法看做一个机械的过程,或者是一组规则,它规定了人们在任何情况下必须执行的某类操作的指令。
今天的计算机技术,人们将“算法”定义为用特定的计算机语言编写的计算机程序。然而,图灵的早期研究则是为了从理论上解决可判定性来定义“算法”,并提出与之相应的图灵机(理论)。
图灵机是假设的抽象“计算机”,如图9.6所示。图灵机由三个部分组成:一条带子,一个读写头和一个控制装置。带子分成许多小格,每小格可存一位数(0或1),也可以是空白的。机器的运作是按逐步进行的方式,每一步由三个不同的动作组成:在任一确定时刻,读写头对准带子上的一个方格,根据该格上的内容和机器的状态决定自己的动作;机器可以抹去带上的原有符号,使方格保持空白或者写上另外的(也可以与原来相同的)符号;然后让带子通过读写头,朝两个方向之一移动一个方格。机器的行为自始至终是由一个指令集所决定,它明确地指示机器每一步应该执行哪三个动作。整个运作从读写头视读第一个方格数据开始,一旦计算结束,机器就进入一个特别的停止状态。运算过程的任何结果都被纪录在带子上。
非确定型图灵机
图9.6 图灵机的图示
图灵机的行为由算法控制,算法的程序由有限条指令组成,每一条取自下列一组可能的选择:
PRINT 0 ON THE CURRENT SQUARE 在当前方格中写0
PRINT 1 ON THE CURRENT SQUARE 在当前方格中写1
GO LEFT ONE SQUARE 左移一格
GO RIGHT ONE SQUARE 右移一格
GO TO STEP i IF THE CURRENT SQUARE CONTAINS 0 若当前方格内容为0,转向步i
GO TO STEP j IF THE CURRENT SQUARE CONTAINS 1 若当前方格内容为1,转向步j
STOP 停止
由这七种简单的指令出发,可以组成所谓的“图灵一波斯特程序”,通过这些程序控制机器完成各种计算。图灵机是一个假想的计算模型,并不是一台实际的机器。从以上介绍可见,它的结构与动作极为简单,但是,正是这样简单的结构包含了现代电子计算机最基本的工作原理:按串行运算、线性储存方式进行符号处理。
利用可计算性,数学家解决了众多的判定性问题,存在(或不存在)某种求解的算法,是确定这些判定性问题的标准。显然算法的存在性判定可以满足纯数学研究的需要。但另一方面,在解决现实问题中,单纯的算法存在性的判定是远远不够的。如果一个算法让高速计算机算上几千年,那么它就毫无实用的价值。我们必须研究有效算法的存在性,制定算法有效性的评估标准。
20世纪60年代,柯勃汉与爱德华兹创立了算法有效性的一种判定法则:区分算法是否有效,要以图灵机为基本的计算工具,用图灵机上完成计算的步数(即图灵程序)来评估一个算法是否有效。一般地,人们习惯于依据“计算时间”的长短来判定算法的有效性,使用这种度量标准,需要使用以下的相关定义:
如果存在确定的整数A和k,对于长度为n的输入数据,计算可以在至多Ank步内完成(对任意的n值)。那么,这个算法被称为“多项式时间算法。”例如,将两个整数相加的标准算法是多项式时间算法。不是多项式时间算法的算法被称之为“指数时间算法”。当一个算法处理长度为n的输入数据时,若需要2n(或3n, nn, n!)步,它就是一个指数时间算法。
柯勃汉和爱德华兹将“有效”算法规定为需要多项式时间的算法。而将需要指数时间的算法规定为“非有效”算法。这种划分方法只是“理论”的划分方法,它与实际应用还有一定的区别。譬如,A=1050和k=500的多项式时间算法在实际意义上一般不会“有效”。所幸的是,在现实问题中,一