NP问题(Non-deterministic polynominal) 是指可以在多项式时间内验证一个解的正确性的问题集合。这意味着如果给定一个解,我们可以在多项式时间内验证该解是否正确。NP问题的一个重要特征是,尽管我们尚未找到在多项式时间内解决它们的算法,但如果我们有了一个解,我们可以在多项式时间内验证该解的正确性。
基本概念:
P问题:(polynominal) 存在多项式时间算法的问题,即在多项式时间内可解的问题;
例如:冒泡排序、希尔排序、堆排序等问题;
NP问题:(Non-deterministic polynominal) 多项式复杂程度的非确定性问题,能在多项式时间内验证出一个正确解的问题,也就是说这个问题不一定在多项式时间内可解,但可以在多项式时间内验证;
例如:找大质数问题,比如13717421拆成两个数相乘,必须是4位乘以4位的,可能很久都解不出来(如果是一个很大很大的数的话),但是我告诉你这是3607*3803得到的,那么很简单就能在多项式时间内验证是否正确,这就是NP问题;
NPC问题(Non-determinism Polynomial complete):存在这样一个NP问题,所有的NP问题都可以约化成它;
NP-Hard问题(Non-determinism Polynomial hard):如果任何一个NP问题都可以通过一个多项式时间算法转换为某个NP问题,即所有的NP问题都可以约化成它。
一些经典的NP问题包括:
布尔可满足性问题(Boolean Satisfiability Problem,SAT): 给定一个布尔表达式,是否存在一种对变量的赋值方式,使得表达式为真。
哈密顿回路问题(Hamiltonian Cycle Problem): 给定一个图,是否存在一条包含图中所有节点的回路。
旅行商问题(Traveling Salesman Problem,TSP): 给定一组城市和它们之间的距离,找到一条访问每个城市一次并返回起始城市的最短路径。
图的着色问题(Graph Coloring Problem): 给定一个图,是否可以用有限种颜色对图中的节点进行着色,使得相邻节点的颜色不相同。
集合覆盖问题(Set Cover Problem): 给定一个集合的集合和一个目标集合,找到最小数量的集合,使得它们的并集等于目标集合。
子集和问题(Subset Sum Problem): 给定一个集合和一个目标值,找到集合中的一个子集,使得子集的元素之和等于目标值。
背包问题(Knapsack Problem): 给定一组物品,每个物品有一个重量和一个价值,以及一个背包的容量限制,找到一个物品子集,使得它们的总重量不超过背包容量,且总价值最大化。
图的最大独立集问题(Maximum Independent Set Problem): 给定一个图,找到一个最大的节点集合,使得这些节点两两不相邻。
图的最大团问题(Maximum Clique Problem): 给定一个图,找到一个最大的完全子图,即图中任意两个节点之间都有边相连。
最长公共子序列问题(Longest Common Subsequence Problem): 给定两个序列,找到它们的最长公共子序列的长度。
分割问题(Partition Problem): 给定一个集合,是否可以将其分割成两个子集,使得两个子集的元素之和相等。
硬币找零问题(Coin Change Problem): 给定一组面额不同的硬币和一个目标金额,找到使用最少数量的硬币凑出目标金额。
连续子数组的最大和问题(Maximum Subarray Problem): 给定一个整数数组,找到一个具有最大和的连续子数组。
背包装载问题(Bin Packing Problem): 给定一组物品和一组容器,每个容器有一个固定的容量,找到一种装载方案,使得物品尽可能均匀地分布在容器中。
最短超字符串问题(Shortest Superstring Problem): 给定一组字符串,找到一个包含所有字符串的最短字符串。
图的最小顶点覆盖问题(Minimum Vertex Cover Problem): 给定一个图,找到一个最小的节点集合,使得每条边都至少与该集合中的一个节点相邻。
多重集划分问题(Multiset Partition Problem): 给定一个多重集,是否可以将其划分成若干个子集,使得每个子集的元素之和相等。
旅行商问题的对偶问题(TSP Dual Problem): 给定一组城市和它们之间的距离,找到一组边,使得图中的每个节点都恰好与这些边相连,并且这些边的总长度最小。
最大二分匹配问题(Maximum Bipartite Matching Problem): 给定一个二分图,找到一个最大的匹配,即图中最大的边集合,使得任意两条边没有公共节点。
最大流问题(Maximum Flow Problem): 给定一个网络图和两个节点,找到从一个节点到另一个节点的最大流量。
图的最长路径问题(Longest Path Problem): 给定一个图,找到一条最长的路径,使得路径中的节点不重复。
子图同构问题(Subgraph Isomorphism Problem): 给定两个图,判断是否存在一个图同构于其中一个图的子图。
拆分图问题(Graph Bisection Problem): 给定一个图,找到一种分割方式,使得两个子图的节点数量尽可能接近。
团问题的变种问题(Variants of Clique Problem): 例如最大权团问题、最小覆盖团问题等,它们都是围绕着图中团的性质展开的。
图的边覆盖问题(Edge Cover Problem): 给定一个图,找到一组边,使得每个节点都至少与其中的一条边相邻。
图的连通分量问题(Connected Components Problem): 给定一个图,找到图中的所有连通分量。
点的双连通分量问题(Biconnected Components Problem): 给定一个无向图,找到图中的所有点的双连通分量。
DAG最长路径问题(Longest Path in DAG Problem): 给定一个有向无环图(DAG),找到一条从源节点到汇节点的最长路径。
最大独立边集问题(Maximum Independent Edge Set Problem): 给定一个图,找到一个最大的边集合,使得这些边两两不相邻。
最大团覆盖问题(Maximum Clique Cover Problem): 给定一个图,找到一组最大的团,使得每个节点都属于至少一个团。
这些问题都是NP问题,但目前尚未找到在多项式时间内解决它们的有效算法。如果一个问题是NP问题,并且有一个在多项式时间内解决它的算法,那么这个问题就属于P类,即NP问题的一个子集。然而,至今尚未发现P类与NP类之间是否存在严格的相等关系,这就是著名的P=NP?问题。