原文地址:http://bristolcrypto.blogspot.com/2014/10/52-things-number-4-complexity-class-p.htmlhtml
这个是密码学52件事第四篇,和理论密码学的第一篇。在这篇中我被要求定义P类复杂问题。我对计算理论科学知道的很是少当我开始个人PhD,并且我确信不少人和我同样。所以这篇文章从最简单的开始,若是你已经会了你能够跳过前面的部分。首先我会描述复杂性的定义和为何他很重要,而后咱们定义图灵机,最后是P类复杂问题,经过一个例子作总结。算法
这篇文章主要的内容就是重写Introduction to the Theory of Computation by Michael Sipser[1],我以为他对我真的很重要。函数
为了设计高效的程序,咱们想知道计算机执行给定任务有多难。问题在于,计算机的处理能力因硬件而异(例如,参考上周的52件事)。因此咱们想要一个不依赖与执行任务的机器的具体细节的任务难度的度量。其中一种方法就是限定一个特定型号的计算机执行操做所须要的操做数。这就是所谓的(时间)复杂性理论。测试
不过操做的数量取决于任务的输入,甚至输入长度相同操做数都不相同。举个栗子,假设咱们设计一个程序来判断你的输入整数是否是质数。若是咱们输入256
,程序可能判断的比输入323
更快。尽管它们的长度都是9.由于第一个数字的2就是它的一个因数,第二个有更大的因数。所以咱们一般给出一个最坏时间复杂的分析,当咱们记录实际的运行长度的时候。所以咱们得到了一个t(n)
的表达式。反应了全部输入的最长运行时间。编码
并且,当输入的长度n
很是大的时候,咱们可以忽略表达式中除了最大项的项,也能够忽略任何实例的系数。这被叫作渐进分析。咱们假设n是很是大的,而且询问当给定最差的n的时候。计算模型须要多少步能完成,而后咱们把答案写成\(O(t(n))\)。例如,若是咱们发现须要$ 6n^3-n^2+1\(步。咱们写作\)O(n^3)$,由于全部的项都能被忽略。spa
现在咱们给出这个第一节当中最常常被用的模型。首先,要明白一个字母表是一个非空有穷集。一个字符串是一个从字母表的符号序列。一个语言是字符串集的一部分。设计
图灵机模型就是真实的计算机。它的内存就是一个有限长度的纸条。任什么时候候,纸条的每一块要么是空的要么是包含了字符表的中的字符。这个机器有一个读写头可以每次在纸带上向左向右移动,或者在纸带上进行读写。在机器运行的开始,纸带最左边n个都是输入,剩下的都是空白的。(输入中没有空白的,这样能够肯定输入结束的位置)。磁带头从最左边的正方形开始,读取一个输入符号,而后根据转换函数决定下一步要作什么。转换函数取决于它当前所读取的内容,和机器当前的状态。和返回:code
这个机器持续的运行,读符号,计算转换函数,写符号,移动,直到进入接受状态或者拒绝状态。htm
若是机器在一个接受状态结束的话,咱们说它接受了输入。可是注意:它可能进入一个循环没有接收也没有拒绝。例如,它可能从不挂起。若是一个图灵机接受一些语言的每一个字符串和拒绝其它字符串,咱们就说这个机器断定了这种语言。咱们把这个过程看做机器测试这个输入字符串是不是这个语言的一部分。给定一个语言,若是有一个图灵机能够断定它,那么咱们就说这个语言是可断定的。blog
这个模型的厉害就是一个图灵机能作现代计算机全部的事情(被叫作Church-Turing论断)。咱们定义时间复杂类\(TIME(t(n))\)这样的一类就是全部的可以被时间复杂度为\(O(t(n))\)的图灵所能断定的,而后咱们就能把计算问题变成一个语言关系问题(输入字符串是某种语言的成员吗?这个表示整数的字符串属于表示素数整数的字符串语言吗?),同时能够将计算问题分类变成时间复杂度类。
最终,咱们终于到达了这个问题!若是\(t(n)=n^k\)对一些\(k>0\),同时\(O(t(n))\)被叫作多项式时间.P类复杂度问题就是那些图灵机能够在\(O(t(n))\)时间内可断定的语言。由于\(k\)可能很是大,图灵机可能运行的很是慢。可是这个类是给粗略的模型,描述了计算机能够实现的功能。注意\(t(n)\)好比\(2^n\)这样时间的语言类与P类是彻底不一样的,增加速度如此之快,即便你对某些语言有一个决定,你可能会发现宇宙在你输入以前就结束了!
咱们用一个多项式时间的问题作一个例子。假设你有一个单向图(一组点和边,每两个点之间最多有一条边,每一个边有一个箭头表示方向)。若是咱们编码这个图,把两个节点当作一个单一字符串。咱们能够造成一种由表示图形的字符串和两个节点组成的语言,这样就能够沿着第一个节点的边走,最终到达第二个节点。所以这个语言会有效率的回答是否有一个从节点A到节点B的路径,这就是路径问题,经过接受或者拒绝你输入的图或者节点。咱们给出这样的决策器,它可以在多项式时间内断定这个问题。
这个过程成功的标记了到A距离为1的全部节点,距离为2的全部节点。。。。。所以图灵机显然能够实现上面的过程。如今咱们考虑这个时间复杂度。步骤1和步骤4太容易了。因此咱们集中注意力在步骤2和步骤3,步骤2包括了搜索输入和在一个位置上放上标记,这个过程明显是多项式时间内能够完成的。步骤3重复步骤2的次数很少于节点的数量,节点的数量确定少于输入的数量,所以这也是线性的。所以整个算法就是线性的。咱们说这个路径问题就是P类问题。
[1] http://www.amazon.co.uk/Introduction-Theory-Computation-Michael-Sipser/dp/0619217642
[2] http://en.wikipedia.org/wiki/Church%E2%80%93Turing_thesis