图论中PNPNPC与NP难问题详解17页PPT
- 格式:ppt
- 大小:2.22 MB
- 文档页数:17
P/NP/NPC 问题及密码学中的主流困难性问题一、图灵机图灵机(英语:Turing machine ),又称确定型图灵机,是英国数学家阿兰·图灵于1936年提出的一种抽象计算模型,其更抽象的意义为一种数学逻辑机,可以看作等价于任何有限逻辑数学过程的终极强大逻辑机器。
图灵的基本思想是用机器来模拟人们用纸笔进行数学运算的过程,他把这样的过程看作下列两种简单的动作:(a )在纸上写上或擦除某个符号;(b )把注意力从纸的一个位置移动到另一个位置。
而在每个阶段,人要决定下一步的动作,依赖于:(a )此人当前所关注的纸上某位置的符号和(b )此人当前思维的状态。
为了模拟人的这种运算过程,图灵构造出一台假想的机器,该机器由以下几个部分组成:一条无限长的纸带TAPE ;一个读写头HEAD ,可以在纸带上左右移动并能读出和改变当前所指的格子上的符号;一套控制规则TABLE ,根据当前机器所处的状态以及当前读写头所指的格子上的符号来确定读写头下一步的动作,并改变状态寄存器的值,令机器进入新的状态。
一个状态寄存器。
它用来保存图灵机当前所处的状态。
图灵机的所有可能状态的数目是有限的,并且有一个特殊的状态,称为停机状态。
图灵机的标准定义如下:一台图灵机是一个七元组0(,,,,,,)accept reject Q q q q δ∑Γ,其中,,Q ∑Γ都是有限集合,且满足Q 是状态集合;∑是输入字母表,其中不包含特殊的空白符;b ∈Γ为空白符;Γ是带字母表,其中∈Γ且∑∈Γ;:{,}Q Q L R δ⨯Γ→⨯Γ⨯是转移函数,其中,L R 表示读写头是左移还是右移; 0q Q ∈是起始状态;accept q Q ∈是接受状态;reject q Q ∈是拒绝状态,且accept reject q q ≠。
图灵机0(,,,,,,)accept reject M Q q q q δ=∑Γ将以如下方式运作:开始的时候将输入符号串*011n ωωωω-=∈∑从左到右依此填在纸带的第0,1,,1n -号格子上,其他格子保持空白(即填以空白符)。
这或许是众多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)。
我们也说,O(n^100)的复杂度小于O(1.01^n)的复杂度。
这或许是众多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)。
我们也说,O(n^100)的复杂度小于O(1.01^n)的复杂度。
P NP NPC三者问题阐述1)"P对NP问题"是什么意思?首先说明一下问题的复杂性和算法的复杂性的区别,下面只考虑时间复杂性。
算法的复杂性是指解决问题的一个具体的算法的执行时间,这是算法的性质;问题的复杂性是指这个问题本身的复杂程度,是问题的性质。
比如对于排序问题,如果我们只能通过元素间的相互比较来确定元素间的相互位置,而没有其他的附加可用信息,则排序问题的复杂性是O(nlgn),但是排序算法有很多,冒泡法是O(n^2),快速排序平均情况下是O(nlgn)等等,排序问题的复杂性是指在所有的解决该问题的算法中最好算法的复杂性。
问题的复杂性不可能通过枚举各种可能算法来得到,一般都是预先估计一个值,然后从理论上证明。
为了研究问题的复杂性,我们必须将问题抽象,为了简化问题,我们只考虑一类简单的问题,判定性问题,即提出一个问题,只需要回答yes或者no的问题。
任何一般的最优化问题都可以转化为一系列判定性问题,比如求图中从A到B的最短路径,可以转化成:从A 到B是否有长度为1的路径?从A到B是否有长度为2的路径?…从A到B是否有长度为k 的路径?如果问到了k的时候回答了yes,则停止发问,我们可以说从A到B的最短路径就是k。
如果一个判定性问题的复杂度是该问题的一个实例的规模n的多项式函数,则我们说这种可以在多项式时间内解决的判定性问题属于P类问题。
P类问题就是所有复杂度为多项式时间的问题的集合。
然而有些问题很难找到多项式时间的算法(或许根本不存在),比如找出无向图中的哈米尔顿回路问题,但是我们发现如果给了我们该问题的一个答案,我们可以在多项式时间内判断这个答案是否正确。
比如说对于哈米尔顿回路问题,给一个任意的回路,我们很容易判断他是否是哈米尔顿回路(只要看是不是所有的顶点都在回路中就可以了)。
这种可以在多项式时间内验证一个解是否正确的问题称为NP问题。
显然,所有的P 类问题都是属于NP问题的,但是现在的问题是,P是否等于NP?这个问题至今还未解决。