APIO2012-lecture-NPC问题与近似算法
什么是P问题、NP问题和NPC问题

什么是P问题、NP问题和NPC问题Program Impossible | 2006-08-28 22:58| 71 Comments | 本文内容遵从CC版权协议转载请注明出自这或许是众多OIer最大的误区之一。
你会经常看到网上出现“这怎么做,这不是NP问题吗”、“这个只有搜了,这已经被证明是NP问题了”之类的话。
你要知道,大多数人此时所说的NP问题其实都是指的NPC问题。
他们没有搞清楚NP问题和NPC问题的概念。
NP问题并不是那种“只有搜才行”的问题,NPC问题才是。
好,行了,基本上这个误解已经被澄清了。
下面的内容都是在讲什么是P问题,什么是NP问题,什么是NPC 问题,你如果不是很感兴趣就可以不看了。
接下来你可以看到,把NP问题当成是 NPC问题是一个多大的错误。
还是先用几句话简单说明一下时间复杂度。
时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快。
也就是说,对于高速处理数据的计算机来说,处理某一个特定数据的效率不能衡量一个程序的好坏,而应该看当这个数据的规模变大到数百倍后,程序运行时间是否还是一样,或者也跟着慢了数百倍,或者变慢了数万倍。
不管数据有多大,程序处理花的时间始终是那么多的,我们就说这个程序很好,具有O(1)的时间复杂度,也称常数级复杂度;数据规模变得有多大,花的时间也跟着变得有多长,这个程序的时间复杂度就是O(n),比如找n个数中的最大值;而像冒泡排序、插入排序等,数据扩大2 倍,时间变慢4倍的,属于O(n^2)的复杂度。
还有一些穷举类的算法,所需时间长度成几何阶数上涨,这就是O(a^n)的指数级复杂度,甚至O(n!) 的阶乘级复杂度。
不会存在O(2*n^2)的复杂度,因为前面的那个“2”是系数,根本不会影响到整个程序的时间增长。
同样地,O (n^3+n^2)的复杂度也就是O(n^3)的复杂度。
因此,我们会说,一个O(0.01*n^3)的程序的效率比O(100*n^2)的效率低,尽管在n很小的时候,前者优于后者,但后者时间随数据规模增长得慢,最终O(n^3)的复杂度将远远超过O(n^2)。
近似算法求解组合优化问题

近似算法求解组合优化问题组合优化问题是计算机科学领域中一个重要的研究方向,主要是研究如何在一定的约束条件下,寻找最优的组合方案。
这类问题包括旅行商问题、背包问题、最小生成树问题等等。
由于这些问题的NP难度,传统的精确求解方法需要耗费大量的计算资源和时间,因此研究人员开始寻找有效的近似算法来求解这些组合优化问题。
近似算法是指在多项式时间内,寻找一个近似最优解,这个解与真实最优解的差距被称为近似比。
对于大多数实际困难问题,近似算法是一个比较实用的解决方案,它可以在可接受的时间内得到一个高质量的解决方案。
现在,我们就来看一下近似算法在求解组合优化问题中的应用。
1. 最小顶点覆盖问题最小顶点覆盖问题是在一个无向图中寻找能够覆盖所有边的最小集合,这个集合由一些顶点组成。
理论上,这个问题是一个NP 完全问题,但是有一个叫做贪心算法的近似算法可以在o(logn)的近似比内求解。
具体的操作方法是选择那些覆盖了最多的未被允许顶点的边,不断地缩小问题规模,最终得到一个近似最优的顶点集合。
2. 最大独立集问题最大独立集问题是指在一个无向图中,找到一个最大的不相邻的顶点集合。
这个问题同样是NP完全问题,但是有一个近似比为1/2的近似算法。
这个算法同样是一种贪心策略,不断地选择与当前最大独立集中的点不相邻的最大度数的点。
通过这种方法,我们可以得到一个包含1/2个最大独立集点数的点集合。
3. 最大割问题在一个无向图中,最大割问题是指在将图中的点划分为两个集合的情况下,找到最大的连接这两个集合的边的权重之和。
由于最大割问题是NP完全问题,因此我们需要使用近似算法来求解。
最常用的是一个叫作随机化取近似算法的方法,这个方法的思想是将整个图分成两个随机的集合,通过一些优化操作来得到一个近似最优的解,其近似比为1/2。
4. 规划集问题规划集问题是容易处理的优化问题之一,它是指在一个网格中寻找一个集合,这个集合包含所有的目标点,其大小最小。
P、NP、NPC、NPH问题的区别和联系

P、NP、NPC、NPH问题的区别和联系P问题 如果⼀个问题能找到在多项式时间内解决它的算法,那么我们说该问题是P类问题。
P是多项式(Polynomial)的第⼀个字母。
⽐如排序问题就是⼀个P问题,因为我们可以找到⼀个时间复杂度为O(n2)O(n2)的冒泡排序算法。
NP问题 ⼀些问题我们很难在多项式时间内找到解决问题的算法,但是如果别⼈给了我⼀个解,我可以很快地验证该解是不是问题的正确答案。
⽐如在汉密尔顿回路问题中,我想验证⼀条路径是否正确,则验证路径是否正确的时间复杂度为O(n)O(n),为多项式级的时间复杂度。
也就是说直接找NP问题的⼀个解可能很慢,当验证NP问题的解却很快。
NPC问题 所有P问题都是NP问题,因为能在多项式时间内解决的问题也能够在多项式时间内验证解的正确性。
是否所有的NP问题都是P问题,这就是著名的“P对NP问题(P=NP?)”。
在2000年美国的Clay数学研究所公布的七个千年数学难题中,P对NP问题位居榜⾸,可见解决该问题的难度。
由于直接证明P对NP问题过于复杂,⼈们引⼊了另⼀类问题--NPC问题(NP -complete,NP-完全问题)。
规约 假设有两个问题A和B,对问题A的输⼊a经过某种规则转换为对问题B的输⼊b,⽽A(a)和B(b)的结果相同,也就是说我们可以将求解A 问题转换为求解B问题,或者说可以⽤解决问题B的⽅法解决问题A,那我们称A可以归约(reducibility,或“约化”)到B。
超级NP问题 是否可以将若⼲相对不那么复杂NP问题不断归约,从⽽得到⼀个最难的“超级NP问题”,所有的NP问题都可以归约到这个“超级NP问题”,只要解决了这个“超级NP问题”,那么也就意味着所有NP问题都可以被解决。
事实上,存在这样的⼀类“超级NP问题”,这也就是我们所说的NPC问题。
NPC问题的定义如下:如果⼀个问题Q,它满⾜以下两条性质:(1). Q是NP问题(2). 任⼀NP问题都可在多项式时间内归约到问题Q那么我们说问题Q是NPC问题。
近似最近邻算法

近似最近邻算法在机器学习和数据挖掘领域中,最近邻算法是一种重要的分类和回归方法。
它基于一个简单的想法:如果一个样本在特征空间中离另一个样本最近,那么它们很可能属于同一类别或具有相似的属性。
最近邻算法的核心是计算样本间的距离或相似度,然后根据距离或相似度来进行分类或回归。
然而,最近邻算法存在一些问题。
首先,如果数据集非常大,计算样本间的距离或相似度将会非常耗时。
其次,如果数据集的维度非常高,计算距离或相似度的结果将会非常稀疏,导致算法的性能下降。
因此,研究人员开发了一种新的算法,称为近似最近邻算法(Approximate Nearest Neighbor,简称ANN),它旨在解决最近邻算法的这些问题。
近似最近邻算法的基本思想是:通过一些技巧和数据结构来近似计算样本间的距离或相似度,从而提高算法的效率和准确性。
这些技巧和数据结构包括哈希函数、局部敏感哈希(Locality-Sensitive Hashing,简称LSH)、球树(Ball-Tree)、kd树(K-Dimensional Tree)等。
这些技巧和数据结构都是为了加速最近邻搜索的过程,并且可以支持高维数据集。
哈希函数是一种将数据映射到离散空间的函数,它可以快速计算样本间的距离或相似度。
局部敏感哈希(LSH)是一种基于哈希函数的技术,它可以将数据集分成多个桶(Bucket),每个桶包含相似的样本,从而实现快速的最近邻搜索。
球树和kd树是一种基于树结构的技术,它们可以将数据集划分成多个子空间,每个子空间包含一组相似的样本,从而实现快速的最近邻搜索。
近似最近邻算法的优点是可以在大规模数据集上进行快速的最近邻搜索,并且可以支持高维数据集。
同时,与传统的最近邻算法相比,近似最近邻算法的误差较小,可以在一定程度上保证算法的准确性。
然而,近似最近邻算法也存在一些缺点。
首先,由于近似计算,算法的准确性不如传统的最近邻算法。
其次,由于需要选择合适的哈希函数、树结构等技术和参数,算法的调参和优化比较困难。
中科大算法第二章近似算法--黄刘生(调整后适合打印版)

NP-完全性理论
Karp的贡献
理查德·卡普(Richard Karp , 1935- ) 1972 年论文 ”Reducibility among Combinatorial Problems” 发 展和加强了由库克提出的“NP完全性”理论。 尤其是库 克仅证明了命题演算的可满足问题是NP完全的,而卡普则证明了从 组合优化中引出的大多数经典问题(背包问题、覆盖问题、匹配问 题、分区问题、路径问题、调度问题等)都是NP完全问题。只要证 明其中任一个问题是属于P类的,就可解决计算复杂性理论中最大 的一个难题,即P=?NP。
SAT∈P当且仅当P=NP
Cook 于1961 年获 Michigan 大学学士学位, 1962 和 1966年分获哈佛 大学硕士与博士学位。 1966-1970 ,他在 UC Berkeley 担任助教授; 1970年加盟多伦多大学,现为该校CS 和数学系教授,他的论文开启 了NP完备性的研究,令该领域于之后的十年成为计算机科学中最活 跃和重要的研究。因其在计算复杂性理论方面的贡献,尤其是在奠 定NP完全性理论基础上的突出贡献而荣获1982年度的图灵奖。
9
P、NP及NPC类问题
NP=?P
∵确定型图灵机是非确定型图灵机的特例,∴P⊆NP 是否有NP⊆P?即是否NP=P?
美国麻省的Clay数学研究所于2000年5月24日在巴黎法兰西学院宣 布:对七个“千年数学难题”中的每一个均悬赏 100 万美元,而 问题NP=?P位列其首:
1.P问题对NP问题 2.霍奇猜想 3. 庞加莱猜想 (2002.11-2003.7 ,俄罗斯数学家佩雷尔曼在 3 篇 论文预印本中证明了几何化猜想,2006被授予菲尔兹奖) 4.黎曼假设 5.杨-米尔斯存在性和质量缺口 6.纳维叶-斯托克斯方程的存在性与光滑性 7.贝赫和斯维讷通-戴尔猜想
P、NP、NP-hard、NPC问题

P、NP、NP-hard、NPC问题P问题:⼀个问题可以在多项式的时间得到解决。
P为英⽂polynominal的⾸字母。
多项式时间的时间复杂度例如O(n)、O(n^2)等等。
NP问题:NP问题可能没有⼀个已知的快速解决⽅案。
但如果能够在多项式的时间内验证⼀个解是否正确,则称此问题为NP问题。
例如根据数据画好了⼀个图。
求解能否找到权重和⼩于100的⽣成树。
这个问题可以在多项式的时间内得到验证。
假设你运⽓好,随⼿⼀画就得到了⼩于100的⽣成树,验证的⽅法只需要将⽣成树的所有树边权重相加。
时间复杂度为O(V)。
V代表树的结点树,⽣成树的边数为|V|-1。
提到NPC问题之前需要了解的概念是规约。
例如⼀个问题A可以约化为问题B的含义是,可以⽤问题B的解法来解决问题A。
或者说A可以转化为B。
例如求⼀元⼀次⽅程可以规约到求⼀元⼆次⽅程。
将⼀元⼆次⽅程的⼆次项系数变为0。
这样两个问题就等价了。
通过实例也可看出问题B不⽐问题A简单,即问题B的时间复杂度⾼于或者等于A。
规约是具有传递性的。
A规约成B,B规约成C,则A能够规约成C。
通过不断地规约,我们能得到复杂度更⾼但是应⽤范围更⼴的算法来代替复杂度虽低但是应⽤范围⼩的⼀类问题的算法。
根据传递性,最终可以得到⼀个复杂度最⾼,并且可以解决所有NP问题的NP问题。
这就是NPC问题,即NP完全问题。
NPC不⽌⼀个,⽽是⼀系列问题。
证明⼀个问题是NPC问题的步骤:1.⾸先要证明此问题是⼀个NP问题。
2.证明⼀个已知的NPC问题能够规约到此问题。
已知的NPC问题,给定⼀个逻辑电路,是否存在⼀种输⼊使得输出为True。
所有的NP问题都可以规约到逻辑电路问题。
直观地解释是计算机中所有的程序最终都转化成01组成的机器语⾔执⾏。
另外⼀个⽐较神奇的问题是,因为NPC问题是NP问题不断规约⽽来的,所以如果能证明⼀个NPC问题可以在多项式时间内解决。
那么所有的NP问题都能在多项式时间内解决。
NP
P/NP问题一个NP-完全的问题具有如下性质:它可以在多项式时间内求解,当且仅当所有的其他的NP-完全问题也可以在多项式时间内求解。
P是所有可在多项式时间内用确定算法求解的判定问题的集合。
NP问题是所有可用多项式时间算法验证其猜测准确性的问题的集合。
令L1和L2是两个问题,如果有一确定的多项式时间算法求解L1,而这个算法使用了一个在多项式时间内求解L2的确定算法,则称L1约化为L2。
如果可满足性约化为一个问题L,则称L问题是NP-难度的。
如果L是NP难度的且L(-NP,则称L是NP-完全的。
NP并不是NON-POLYNOMIAL,把NP说成是NON -POLYNOMIAL,是望文生义,读书不求甚解。
事实上,如果你能够证明某个NP问题是个NON-POLYNOM IAL的问题,你就可以去领那七个百万美元数学大奖中间的一个了。
数学上著名的NP问题,完整的叫法是N P完全问题,也即“NP COMPLETE”问题,简单的写法,是NP=P?的问题。
问题就在这个问号上,到底是NP等于P,还是NP不等於P。
证明其中之一,便可以拿百万美元大奖。
这个奖还没有人拿到,也就是说,NP问题到底是Polynomial,还是Non-Polynomial,尚无定论。
Mr. X信口开河敢说NP就是Non-Polyno mial,真是不知天高地厚,惹人笑话。
NP里面的N,不是Non-Polynomial的N,是Non-Deterministic,P代表Polynomial倒是对的。
NP就是Non-deterministic Polynomial的问题,也即是多项式复杂程度的非确定性问题。
P/NP问题是在理论信息学中计算复杂度理论领域里至今没有解决的问题,它被“克雷数学研究所”(Cl ay Mathematics Institute, 简称CMI)在千禧年大奖难题中收录。
P/NP问题中包含了复杂度类P与NP 的关系。
1971年史提芬〃古克(Stephen A. Cook) 和Leonid Levin 相对独立的提出了下面的问题,即是否两个复杂度类P和NP是恒等的(P=NP?)。
NP问题算法
4.算法方面:4.1对于文中出现的NP问题,经查资料了解到的信息如下:(1)相关概念*P: 能在多项式时间内解决的问题*NP: 不能在多项式时间内解决或不确定能不能在多项式时间内解决,但能在多项式时间验证的问题*NPC: NP完全问题,所有NP问题在多项式时间内都能约化(Reducibility)到它的NP问题,即解决了此NPC问题,所有NP问题也都得到解决。
*NP hard:NP难问题,所有NP问题在多项式时间内都能约化(Reducibility)到它的问题(不一定是NP问题)。
(2)四者之间的联系即P问题⊂NP问题,NPC问题⊂NP问题,NPC问题也同时⊂NP hard问题,也就是NPC问题为NP问题与NP hard问题的交集。
(3)关于NP问题的一些案例和算法思想NP是指非确定性多项式(non-deterministic polynomial,缩写NP)。
所谓的非确定性是指,可用一定数量的运算去解决多项式时间内可解决的问题。
NP 问题通俗来说是其解的正确性能够被“很容易检查”的问题,这里“很容易检查”指的是存在一个多项式检查算法。
相应的,若NP中所有问题到某一个问题是图灵可归约的,则该问题为NP困难问题。
典型案例:著名的推销员旅行问题(Travel Saleman Problem or TSP):假设一个推销员需要从香港出发,经过广州,北京,上海,…,等n 个城市,最后返回香港。
任意两个城市之间都有飞机直达,但票价不等。
假设公司只给报销C元钱,问是否存在一个行程安排,使得他能遍历所有城市,而且总的路费小于C?迄今为止,这类问题中没有一个找到有效算法。
倾向于接受NP完全问题(NP-Complete或NPC)和NP难题(NP-Hard或NPH)不存在有效算法这一猜想,认为这类问题的大型实例不能用精确算法求解,必须寻求这类问题的有效的近似算法。
而对于NP 问题中最难的问题--NP-complete 问题,它的定义是,如果你可以找到一个解决某个NP-complete 问题的多项式算法,那么所有的NP 问题都将可以很容易地解决。
近似点算法
近似点算法
在计算机科学中,近似点算法是一类解决近似计算问题的算法。
这种算法被广泛应用于某些计算问题,尤其是对于那些在多项式时间
内不可能精确求解的问题,近似点算法提供了一种高效的求解方法。
近似点算法的基本思想是,通过求得问题的最优近似解,来代替
原问题的精确解。
这种方法虽然无法保证得到精确解,但却可以在可
接受的误差范围内得到最佳解。
在实际应用中,有些问题考虑了时间
复杂度的问题,利用近似点算法求解最优解比直接求解的时间效率高
出很多。
近似点算法的应用范围广泛,例如在大规模网络分析、社交网络
分析、最优化问题求解等方面都得到了广泛应用。
在社交网络分析中,这种算法可以用于寻找最具有影响力的节点,在最优化问题求解中,
近似点算法能找到最小化成本的解决方案。
近似点算法还可以在生物信息学领域中应用。
例如寻找基因序列,通过这种算法可以得到最优近似解,即最接近原始基因序列的可能子串。
这种算法还可以在癌症基因分析、新药筛选等领域中应用。
总的来说,近似点算法在解决高维复杂问题时具有很强的优势。
虽然它无法保证得到最精确的解决方案,但通过寻找最优近似解,它
为许多实际应用带来了很大的便利。
因此,近似点算法在计算机科学、数据科学等领域都有着广泛的应用前景。
近似算法与随机化算法
近似算法与随机化算法近似算法基本概念所有已知的解决NP-难问题算法都有指数型运行时间。
但是,如果我们要找一个"好"解而非最优解,有时候多项式算法是存在的。
给定一个最小化问题和一个近似算法,我们按照如下方法评价算法:首先给出最优解的一个下界,然后把算法的运行结果与这个下界进行比较。
对于最大化问题,先给出一个上界然后把算法的运行结果与这个上界比较。
近似算法比较经典的问题包括:最小顶点覆盖、旅行售货员问题、集合覆盖等。
迄今为止,所有的NP完全问题都还没有多项式时间算法。
对于这类问题,通常可采取以下几种解题策略。
(1)只对问题的特殊实例求解(2)用动态规划法或分支限界法求解(3)用概率算法求解(4)只求近似解(5)用启发式方法求解若一个最优化问题的最优值为c*,求解该问题的一个近似算法求得的近似最优解相应的目标函数值为c,则将该近似算法的性能比定义为max(c/c*,c*/c)。
在通常情况下,该性能比是问题输入规模n的一个函数ρ(n),即max(c/c*,c*/c)=ρ(n)。
该近似算法的相对误差定义为Abs[(c-c*)/c*]。
若对问题的输入规模n,有一函数ε(n)使得Abs[(c-c*)/c*]=ε(n),则称ε(n)为该近似算法的相对误差界。
近似算法的性能比ρ(n)与相对误差界ε(n)之间显然有如下关系:ε(n)≤ρ(n)-1。
顶点覆盖问题的近似算法问题描述:无向图G=(V,E)的顶点覆盖是它的顶点集V的一个子集V'V,使得若(u,v)是G的一条边,则v∈V'或u∈V'。
顶点覆盖V'的大小是它所包含的顶点个数|V'|。
VertexSet approxVertexCover(Graph g){cset=;e1=g.e;while(e1!=){从e1中任取一条边(u,v);cset=cset∪{u,v};从e1中删去与u和v相关联的所有边;}return c}Cset用来存储顶点覆盖中的各顶点。