# 1. P、NP、NPC 和 NP-Hard 问题的通俗化解释和详细区分

  1. 多项式级的复杂度:O(1), O(n), O(n^2), O(lg(n)), O(nlg(n))
  2. 非多项式级的复杂度:O(2^n), O(n!)
  • P 问题:可以在多项式时间内找到解决该问题的算法
  • NP 问题:可以在多项式的时间里验证该问题的一个解
  • NPC 问题:是一个 NP 问题,并且所有的 NP 问题都可以约化到该问题
  • NP-hard 问题:不一定是一个 NP 问题,但所有的 NP 问题都可以约化到该问题

NPC

注意:时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快。

# 2. 规约/约化

问题A可以约化为问题B,称为“问题A可规约为问题B”,可以理解为问题B的解一定就是问题A的解,因此解决A不会难于解决B。由此可知问题B的时间复杂度一定大于等于问题A。

比如:求解一个一元一次方程和求解一个一元二次方程。那么我们说,前者可以规约为后者,意即知道如何解一个一元二次方程那么一定能解出一元一次方程。

# 3. 判断 NP 问题的技巧

  1. 元素较少时算法的运行速度非常快,但随着元素数量的增加,速度会变得非常慢。
  2. 涉及“所有组合”的问题通常是NP完全问题。
  3. 不能将问题分成小问题,必须考虑各种可能的情况。这可能是NP完全问题。
  4. 如果问题涉及序列(如旅行商问题中的城市序列)且难以解决,它可能就是NP完全问题。
  5. 如果问题涉及集合(如广播台集合)且难以解决,它可能就是NP完全问题。
  6. 如果问题可转换为集合覆盖问题或旅行商问题,那它肯定是NP完全问题。