
所谓NP-hard,指所有NP问题都能在多项式时间复杂度内归约到的问题。
这里梳理下涉及到的知识点,主要参考来源:
《什么是P、NP、NPC、NP-Hard问题》、《什么是P问题、NP问题和NPC问题》、《何为NP-hard》、百度百科:NP-hard
介绍一些预备知识
1. 时间复杂度
时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快。
程序的时间复杂度一般可以分为两种级别:
- 多项式级的复杂度,如O(1),O(log(n))、O(n^a)等
- 非多项式级(NP,non-deterministic polynomia)的复杂度,如O(a^n)、O(n!)等。后者的复杂度计算机往往不能承受。
自然地,可以想到一个问题:
会不会所有的问题都可以找到复杂度为多项式级的算法呢?
显然,“不可能”。
例如著名的旅行商问题(Travel Saleman Problem or TSP):假设一个推销员需要从香港出发,经过广州,北京,上海,…,等 n 个城市, 最后返回香港。 任意两个城市之间都有飞机直达,但票价不等。假设公司只给报销 C 元钱,问是否存在一个行程安排,使得他能遍历所有城市,而且总的路费小于 C?
推销员旅行问题显然是 NP 的。因为如果你任意给出一个行程安排,可以很容易算出旅行总开销。但是,要想知道一条总路费小于 C 的行程是否存在,在最坏情况下,必须检查所有可能的旅行安排! 这种枚举法