当前位置:网站首页>P问题、NP问题、NPC问题、NP-hard问题详解
P问题、NP问题、NPC问题、NP-hard问题详解
2022-07-06 05:58:00 【瞻邈】
1. 多项式时间(Polynomial time)
时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当程序所处理的问题规模扩大后,程序需要的时间长度对应增长得有多快。也就是说,对于某一个程序,其处理某一个特定数据的效率不能衡量该程序的好坏,而应该看当这个数据的规模变大到数百倍后,程序运行时间是否还是一样,或者也跟着慢了数百倍,或者变慢了数万倍。
不管数据有多大,程序处理所花的时间始终是那么多的,我们就说这个程序很好,具有O(1)的时间复杂度,也称常数级复杂度;数据规模变得有多大,花的时间也跟着变得有多长,比如找n个数中的最大值这个程序的时间复杂度就是O(n),为线性级复杂度,而像冒泡排序、插入排序等,数据扩大2倍,时间变慢4倍的,时间复杂度是,为平方级复杂度。还有一些穷举类的算法,所需时间长度成几何阶数上涨,这就是的指数级复杂度,甚至的阶乘级复杂度。
结合函数增加速度和算法的实际运行效果,多项式时间算法可视为高效算法或实用算法,指数时间算法为不实用算法。
2. 确定性算法与非确定性算法
2.1. 确定性算法
设A是求解问题B的一个解决算法,在算法的整个执行过程中,每一步都能得到一个确定的解,这样的算法就是确定性算法。
2.2. 非确定性算法
设A是求解问题B的一个解决算法,它将问题分解成两部分,分别为猜测阶段和验证阶段,其中
- 猜测阶段:在这个阶段,对问题的一个特定的输入实例x产生一个任意字符串y,在算法的每一次运行时,y的值可能不同,因此,猜测以一种非确定的形式工作。
- 验证阶段:在这个阶段,用一个确定性算法(有限时间内)验证。①检查在猜测阶段产生的y是否是合适的形式,如果不是,则算法停下来并得到no;② 如果y是合适的形式,则验证它是否是问题的解,如果是,则算法停下来并得到yes,否则算法停下来并得到no。它是验证所猜测的解的正确性。
3. 规约/约化
问题A可以约化为问题B,称为“问题A可规约为问题B”,可以理解为问题B的解一定就是问题A的解,因此解决A不会难于解决B。由此可知问题B的时间复杂度一定大于等于问题A。
现在有两个问题:求解一个一元一次方程和求解一个一元二次方程。那么我们说,前者可以规约为后者,意即知道如何解一个一元二次方程那么一定能解出一元一次方程。我们可以写出两个程序分别对应两个问题,那么我们能找到一个“规则”,按照这个规则把解一元一次方程程序的输入数据变一下,用在解一元二次方程的程序上,两个程序总能得到一样的结果。这个规则即是:两个方程的对应项系数不变,一元二次方程的二次项系数为0。
从规约的定义中我们看到,一个问题规约为另一个问题,时间复杂度增加了,问题的应用范围也增大了。通过对某些问题的不断规约,我们能够不断寻找复杂度更高,但应用范围更广的算法来代替复杂度虽然低,但只能用于很小的一类问题的算法。存在这样一个NP问题,所有的NP问题都可以约化成它。换句话说,只要解决了这个问题,那么所有的NP问题都解决了。这种问题的存在难以置信,并且更加不可思议的是,这种问题不只一个,它有很多个,它是一类问题。这一类问题就是传说中的NPC问题,也就是NP-完全问题。
4. P类问题、NP类问题、NPC问题、NP难问题
P类问题:能在多项式时间内可解的问题。
NP类问题:在多项式时间内“可验证”的问题。也就是说,不能判定这个问题到底有没有解,而是猜出一个解来在多项式时间内证明这个解是否正确。即该问题的猜测过程是不确定的,而对其某一个解的验证则能够在多项式时间内完成。P类问题属于NP问题,但NP类问题不一定属于P类问题。
NPC问题:存在这样一个NP问题,所有的NP问题都可以约化成它。换句话说,只要解决了这个问题,那么所有的NP问题都解决了。其定义要满足2个条件:
- 它是一个NP问题;
- 所有NP问题都能规约到它。
NP难问题:NP-Hard问题是这样一种问题,它满足NPC问题定义的第二条但不一定要满足第一条(就是说,NP-Hard问题要比 NPC问题的范围广,NP-Hard问题没有限定属于NP),即所有的NP问题都能约化到它,但是他不一定是一个NP问题。NP-Hard问题同样难以找到多项式的算法,但它不列入我们的研究范围,因为它不一定是NP问题。即使NPC问题发现了多项式级的算法,NP-Hard问题有可能仍然无法得到多项式级的算法。事实上,由于NP-Hard放宽了限定条件,它将有可能比所有的NPC问题的时间复杂度更高从而更难以解决。
以上四个问题之间的关系如下图所示:
参考文献
边栏推荐
- The difference and usage between continue and break
- Memory and stack related concepts
- Commodity price visualization
- The digital economy has broken through the waves. Is Ltd a Web3.0 website with independent rights and interests?
- Grant Yu, build a web page you want from 0
- Luogu p1460 [usaco2.1] healthy Holstein cows
- Sequoiadb Lake warehouse integrated distributed database, June 2022 issue
- Hongliao Technology: how to quickly improve Tiktok store
- continue和break的区别与用法
- Interface test: what are the components of the URL in fiddler
猜你喜欢
随机推荐
Pay attention to the details of pytoch code, and it is easy to make mistakes
IP day 16 VLAN MPLS configuration
假设检验学习笔记
Zoom through the mouse wheel
[leetcode] day96 - the first unique character & ransom letter & letter ectopic word
Investment strategy discussion and market scale prediction report of China's solid state high power amplifier industry from 2022 to 2028
Network protocol model
c语言——冒泡排序
[Jiudu OJ 07] folding basket
High quality coding tool clion
Market development prospect and investment risk assessment report of China's humidity sensor industry from 2022 to 2028
Station B Liu Erden linear regression pytoch
[Thesis code] SML part code reading
Wib3.0 leapfrogging, in leapfrogging (ง • ̀_•́) ง
Redis message queue
Analysis report on development trends and investment planning of China's methanol industry from 2022 to 2028
Request forwarding and redirection
[web security] nodejs prototype chain pollution analysis
The difference and usage between continue and break
Garbage collector with serial, throughput priority and response time priority