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