基本概念
由多项式时间算法解决的问题集合。
其中多项式时间算法指的是{==算法的时间复杂度与输入的长度之间是多项式关系==}
NP(Non-deterministic Polynomial time)问题是指可以在多项式时间内验证一个解的问题集合。但是并不确定能不能在多项式时间内找到一个解。
多项式时间验证
we say is an efficient verifier for problem if
-
runs in polynomial time,taking two arguments: an instance and a certificate .
-
there exists a polynomial such that for every in , there is a certificate of length at most such that accepts
NP-hard问题是指所有的NP问题都能在多项式时间内约化为该问题。NP-hard问题不一定是NP问题,它是比NP问题更难的问题。
NPC(NP-Complete)问题是指既是NP问题,又是NP问题中最难的问题(NP-hard)。如果能在多项式时间内解决一个NPC问题,那么所有的NP问题都能在多项式时间内解决。也就是说
- P问题能在多项式时间内解决,自然也能在多项式时间内验证,所以P问题是NP问题的子集。
- NPC问题是NP问题的子集,
- NPC问题也是NP-hard问题的子集,,
- NP-hard问题不一定是NP问题,
- 如果NPC问题能在多项式时间内解决,那么所有的NP问题都能在多项式时间内解决,
常见的多项式时间问题
- 最短路径问题::给定一个有向图即使是带负权的,我们可以在 的时间内找到从单一源顶点开始的最短路径;这是多项式时间的,因为图中我们的输入规模可以视为
- 欧拉回路问题:是否存在一条路径,经过图中每条边恰好一次,且最终回到起点。这个问题可以在 的时间内使用深度优先搜索解决。
- 问题:给定一个合取范式(如果它是由 个子句的合取构成的,每个子句是由个变量或者它们的否定构成的析取),也可以在多项式时间内找到是否存在变量的0,1赋值,使得合取式为真。
0-1背包问题的时间复杂度是指数级别的,不是多项式时间的。其背包容量是使用2进制表示的(),前面讨论的指的是个2进制编码
形式语言(formal language)
一个形式语言是一个字符串的集合,,其中是一个有限的字母表,其上的字符串(string)是字母表上的字符的有限序列,所有这样的字符串构成了。
- {==至多可数的集合上的有限字符串是可数的==}
- {==语言可以做衔接、并、交、补、Kleene 闭包(由集合中的符号生成的所有可能的有限长度的字符串所构成的集合)等运算==}
给定语言,输入某一个字符串,判定问题是指判断是否属于。如果,则输出YES,否则输出NO。(decision problem)
solves problem ( decides language ) if for every
accepts if and only if
给定语言,搜索问题是指找到一个,使得。
给定语言和,计算某个从到的函数。
Karp归约
称一个语言可以多项式归约( 归约)到另一个语言,如果存在一个多项式时间的计算函数,使得
记作。此时说明 至少和 一样难。
那么对于和的关系,我们可以得到如下结论:
如果我们找到了一个问题,那么所有的问题都可以归约到这个问题,也就是说,如果我们能在多项式时间内解决一个问题,那么所有的问题都可以在多项式时间内解决。此时有
如果我们不能在多项式时间内解决一个问题,那么因为问题是问题的子集,所以是不等于的。
但是很遗憾的是,目前还没有人能够证明是否等于,也就是说我们还不知道问题是否可以在多项式时间内解决。
