A problem is said to be Nondeterministically Polynomial (NP) if we can find a nodeterminsitic Turing machine that can solve the problem in a polynomial number of nondeterministic moves.
An equivalent but casual definition to NP-Complete: A problem R is NP-complete if R is the "most difficult" of NP problem.
Optimization problems whose decision versions are NP-complete are called NP-hard.
在算法复杂度分析的过程中,人们常常用特定的函数来描述目标算法,随着变量n的增长,时间或者空间消耗的增长曲线,近而进一步分析算法的可行性(有效性)。
引入了Big-O,Big-Ω,来描述目标算法的上限、下限复杂度函数。
用Big-Θ描述和目标函数同序的复杂度函数,即由Big-Θ既是上限也是下限。
常常用到如下时间复杂度函数标度
1, log n, n, n log n, n^2, 2^n, n!
通常将具有n^x,x为正整数形式的时间复杂度函数称为多项式复杂度。认为具有多项式时间复杂度的算法是容易求解的。超过多项式时间复杂度,算法增长迅速,不易求解。
根据含 n 的表达式随 n 增大的增长速度,可以将它们排序:1 < lg(n) < n < nlg(n) < n^2 < ... < n^k (k是常数)< ... < 2^n。最后这个 2 的 n 次方就是级数增长了,读过棋盘上放麦粒故事的人都知道这个增长速度有多快。而之前的那些都是 n 的多项式时间的复杂度。
通常问题分为 可解决(Solvable) 和 不可解决(Unsolvable)。
可决绝问题又可以分为 易解决(Tractable)、不易解决(Intractable)和不确定是否容易解决(NP)
可解决(Solvable)是指存在算法能够解决的问题
不可解决(Unsolvable)是指不存在解决该问题的算法,如The Halting Problem。
易解决(Tractable),即P问题,是指具有最坏时间复杂度为多项式时间的算法能够解决的问题
不易解决(Intractable)是指不存在最坏时间复杂度为多项式时间的算法能够解决的问题
不确定是否容易解决(NP),还未被证明是否存在多项式算法能够解决这些问题,而其中NP完全问题又是最有可能不是P问题的问题类型。
NP-Hard和NP-Complete 区别
对NP-Hard问题和NP-Complete问题的一个直观的理解就是指那些很难(很可能是不可能)找到多项式时间算法的问题. 因此一般初学算法的人都会问这样一个问题: NP-Hard和NP-Complete有什么不同? 简单的回答是根据定义, 如果所有NP问题都可以多项式归约到问题A, 那么问题A就是NP-Hard; 如果问题A既是NP-Hard又是NP, 那么它就是NP-Complete. 从定义我们很容易看出, NP-Hard问题类包含了NP-Complete类. 但进一步的我们会问, 是否有属于NP-Hard但不属于NP-Complete的问题呢? 答案是肯定的. 例如停机问题, 也即给出一个程序和输入, 判定它的运行是否会终止. 停机问题是不可判的, 那它当然也不是NP问题. 但对于SAT这样的NP-Complete问题, 却可以多项式归约到停机问题. 因为我们可以构造程序A, 该程序对输入的公式穷举其变量的所有赋值, 如果存在赋值使其为真, 则停机, 否则进入无限循环. 这样, 判断公式是否可满足便转化为判断以公式为输入的程序A是否停机. 所以, 停机问题是NP-Hard而不是NP-Complete.