著名的P=NP问题到底是什么

简介: 对于高速处理数据的计算机来说,处理某一个特定数据的效率不能衡量一个程序的好坏,而应该看当这个数据的规模变大到数百倍后,程序运行时间是否还是一样,或者也跟着慢了数百倍,或者变慢了数万倍。

你会经常看到网上出现“这怎么做,这不是NP问题吗”、“这个只有搜了,这已经被证明是NP问题了”之类的话。这或许是众多OIer最大的误区之一。你要知道,大多数人此时所说的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.01n^3)的程序的效率比O(100n^2)的效率低,尽管在n很小的时候,前者优于后者,但后者时间随数据规模增长得慢,最终O(n^3)的复杂度将远远超过O(n^2)。我们也说,O(n^100)的复杂度小于O(1.01^n)的复杂度。

相关文章
|
2月前
|
数据可视化 数据挖掘 Linux
Python数据分析(四)——plot方法
Python数据分析(四)——plot方法
|
4月前
|
存储 算法 数据挖掘
精通 NumPy 数值分析:6~10
精通 NumPy 数值分析:6~10
61 0
|
4月前
|
机器学习/深度学习 算法 数据挖掘
精通 NumPy 数值分析:1~5
精通 NumPy 数值分析:1~5
83 0
|
7月前
|
计算机视觉
OpenCV-黑帽运算(BLACKHAT)
OpenCV-黑帽运算(BLACKHAT)
|
11月前
|
存储 并行计算 Linux
MXNet安装和NDArray
MXNet安装和NDArray
113 0
|
12月前
|
机器学习/深度学习 编解码 计算机视觉
详细解读Google新作 | 教你How to train自己的Transfomer模型?
详细解读Google新作 | 教你How to train自己的Transfomer模型?
157 0
|
存储 Python
每个数据科学家都应该知道的20个NumPy操作
每个数据科学家都应该知道的20个NumPy操作
83 0
每个数据科学家都应该知道的20个NumPy操作
|
机器学习/深度学习 PyTorch 算法框架/工具
Tensor:Pytorch神经网络界的Numpy(二)
Tensor:Pytorch神经网络界的Numpy(二)
180 0
Tensor:Pytorch神经网络界的Numpy(二)
|
机器学习/深度学习 PyTorch 算法框架/工具
Tensor:Pytorch神经网络界的Numpy(一)
Tensor:Pytorch神经网络界的Numpy(一)
138 0
Tensor:Pytorch神经网络界的Numpy(一)
|
Python
全方位剖析Numpy中的np.diag源代码
全方位剖析Numpy中的np.diag源代码