NP-hard问题:比NPC更难,通常在多项式时间内无法验证一个解的正确性。几个复杂度的区别可以看NPC介绍。
常见证明
我们要证明一个问题A是NP-hard问题一般可以分为两步:
1) 对问题A给定限制条件得到一个特例B问题
2)证明问题B是NPC问题。
以下罗列四个较直观简单的例子:
- Dense Induced Subgraph
问题:给定图 G G G,正整数 k k k和 l l l,是否存在 k k k个点的生成子图包含最少 l l l条边。
证明:令 l = C k 2 l=C_k^2 l=Ck2,那么该问题变成Clique问题(NPC问题)
解释: k k k个点的完全子图最多的边包含 C k 2 C_k^2 Ck2,所以当 l = C k 2 l=C_k^2 l=Ck2,那么原问题变成寻找 k k k个点的子图且是完全图,那么就是Clique问题。
- Edge Packing
问题:给定图 G G G,正整数 k k k和 l l l,图 G G G是否存在 l l l条边与最多 k k k个点相邻。
证明:令 l = C k 2 l=C_k^2 l=Ck2,那么该问题变成Clique问题(NPC问题)
解释: k k k个点的完全子图最多的边包含 C k 2 C_k^2 Ck2,那么当 l = C k 2 l=C_k^2 l=Ck2,最少需要 k k k个点,此时原问题变成Clique问题。
- Hitting Rectangles
问题:平面上有一组长方形 R R R,一组点 P P P,和一个正整数 k k k,是否可以从 P P P中选择 k k k个点,使得任意一个长方形上都有点。
证明:特例是点覆蓋。
解释:绘制一个图G, u u u和 v v v是 P P P中的两个点, u u u和 v v v之间如果有边,则表示一个长方形。那么在这种情况下,需要覆蓋所有的边,该问题就成了点覆蓋问题。
- Eulerian Subgraph
问题:给定图 G G G,正整数 k k k,图 G G G中是否存在Eulerian子图恰好包含 k k k条边。
证明:对于Cubic Graphs(所有点的度都等于3),令 k = n k=n k=n,那么该问题就等价成哈密尔顿回路问题,是NPC复杂度。
解释: k = n k=n k=n时,可以证明所有的点都只经过一次,因为每个点的度数都不超过3,如果经过两次,度数就为4。