什么是计算复杂性,要说明这个问题,就要先说什么是计算。我们说的计算是可以用图灵机计算的。图灵机指的是程序。计算复杂性既包括一个问题能否可解,也包括一个问题的计算难度,当然还有其他方面考量一个问题的计算复杂性。

  如果一个问题可以通过写出一个程序得到解,那么我们说这个问题是可解的,如果我们写不出一个程序去解决一个问题,那么这个问题是不可解的。

  对于可解的问题来说,我们就需要讨论他们的计算难度。可以知道的是,有些问题我们可以通过图灵机很快的解决,而有些问题相对复杂,没有办法一下子就能够算的出来,但是它还是可以算出来的。

  我们给不同计算难度的问题进行分类。

  在这之前需要明确确定性图灵机和非确定性图灵机的概念。确定性图灵机指的是我们普通的程序,他是通过指令一步一步实现的。而非确定性图灵机指的是一种假设的具有神奇力量的程序,他可以一下就选择出正确的结果来。

  可以通过确定性图灵机在多项式时间内解决的问题我们称为P问题,P是指Polynomial time,多项式时间能够解决的问题。而有些问题我们到目前位置并没有找到多项式时间解决的程序,但是我们通过非确定性图灵机,总是能神奇的选择一个正确的答案,并且能够在多项式时间内验证这个答案是否正确,那么我们说这类问题是NP问题,NP中的N是指nondetermine muchine,P是指Polynomial time。显而易见的是,如果有这么一种神奇的机器,那么任何P问题都是可以用非确定性图灵机,在多项式时间内验证的算法解决的。因此P⊆NP,但是否NP⊆P,目前来说还没有答案,很多人认为P≠NP,计算机科学理论很多都是在这个基础上做的,假如P=NP,那么密码学将面临很重大的挑战。

  我们给定,假如有一个问题,所有的NP问题都能够规约到这个问题上,那么我们说这个问题是NP-hard问题。从定义上来讲,NP-hard是很难的问题了。因为所有NP问题都能规约到NP-hard问题,假如我能够用多项式时间解决NP-hard问题,那么就能够证明NP=P了。假如一个问题,它既是NP问题,又是NP-hard问题,那么这个问题我们称为NP-Complete问题。

  Cook定理是由Cook证明的,第一个NP-Complete问题是SAT问题(可满足性问题)。他指出,任何NP-Complete问题都可以从SAT问题规约过去,只要解决NP-Complete问题中的一个,那么其他的NP-Complete问题都能够迎刃而解。这就是研究NP-Complete问题的意义所在。

  关于如何规约,给定两个问题Q1和Q2,x是问题Q1的实例,y是问题Q2的实例,如果我能够找到一个多项式时间的算法A,使得A(x)=y,如果x实例在Q1问题中是判定yes的,那么y实例在Q2问题中是判定yes的,如果x实例在Q1问题中是判定no的,那么y实例在Q2问题中是判定no。这样我们就完成了从问题Q1到问题

Q2的规约。规约说明Q2并不比Q1容易,Q1并不比Q2难。在规约的过程中要注意问题的输入,两边都要证明才能做到“当且仅当”。