算法设计与分析什么是P问题NP问题与NPC问题22页PPT
- 格式:ppt
- 大小:5.77 MB
- 文档页数:22
P问题、NP问题、NP完全问题和NP难问题在讲P类问题之前先介绍两个个概念:多项式,时间复杂度。
(知道这两概念的可以⾃动跳过这部分)1、多项式:axn-bxn-1+c恩....就是长这个样⼦的,叫x最⾼次为n的多项式....咳咳,别嫌我啰嗦。
有些⼈说不定还真忘了啥是多项式了。
例如第⼀次看到的鄙⼈→_→2、时间复杂度我们知道在计算机算法求解问题当中,经常⽤时间复杂度和空间复杂度来表⽰⼀个算法的运⾏效率。
空间复杂度表⽰⼀个算法在计算过程当中要占⽤的内存空间⼤⼩,这⾥暂不讨论。
时间复杂度则表⽰这个算法运⾏得到想要的解所需的计算⼯作量,他探讨的是当输⼊值接近⽆穷时,算法所需⼯作量的变化快慢程度。
举个例⼦:冒泡排序。
在计算机当中,排序问题是最基础的,将输⼊按照⼤⼩或其他规则排好序,有利于后期运⽤数据进⾏其他运算。
冒泡排序就是其中的⼀种排序算法。
假设⼿上现在有n个⽆序的数,利⽤冒泡排序对其进⾏排序,①⾸先⽐较第1个数和第2个数,如果后者>前者,就对调他们的位置,否则不变②接着⽐较第2个数和第3个数,如果后者>前者,就对调他们的位置,否则不变③⼀直向下⽐较直到第n-1和第n个数⽐较完,第⼀轮结束。
(这时候最⼤的数移动到了第n个数的位置)④重复前三步,但是只⽐较到第n-1个数(将第⼆⼤的数移动到第n-1个数位置)⑤持续每次对越来越少的元素重复上⾯的步骤,直到没有任何⼀对数字需要⽐较。
举个实例:5,4,3,2,1,对其进⾏排序,先是⽐较5跟4变成4,5,3,2,1,第⼀轮结束后变成43215,可以计算,当对其排序完正好要经过4+3+2+1=10次⽐较,当然这是最复杂的情况,即完全反序。
可以知道对于n个数,⾄多要经过1+2+...+n-1即(n^2-n)/2次⽐较才能排好序。
这个式⼦⾥n的最⾼次阶是2,可知道当n→∞时,⼀次性对其⽐较次数影响很⼩,所以我们把这个算法的时间复杂度⽐作:o(n^2)。
取其最⾼次,可以看出,这是⼀个时间复杂度为多项式的表⽰⽅式。
NP 类问题不难看出,上面定义的P 类语言只能用来描述那些存在有效算法(多项式时间)的问题。
然而,在实际中存在许多别的重要问题,对于它们,至今尚未找到有效的求解算法。
其中有一大类这样的问题,虽然不知道求解它们的有效算法,但是,一旦通过某种办法给出了其答案的一个猜测或估计,就能设计出一个多项式时间算法来验证其真实性(称为多项式时间可验证性)。
这类问题的分析和描述需要借助另一类图灵机作为计算模型。
非确定性单带图灵机(non-deterministic one-tape Turing machine),简记为NDTM ,是一种假想的机器。
通常有两种方式描述它:多值模型和猜想模块模型。
多值模型认为它和确定性图灵机的共同之处是也包括:(a).带中字符集Γ,使得Γ⊂∑,且 ∑-Γ∈b ;(b).有限状态集},,{0q q q Q N Y ⊇;不同之处在于(c).多值转移函数},{2}),{\(:r l Q N Y q q Q ⨯Γ⨯→Γ⨯δ,},{),(r l Q S s q ⨯Γ⨯⊆ ,确定性图灵机在任一状态只能做一种运算,而非确定性图灵机在同一时刻可以独立、并行地完成(无限)多种运算(表现在转移函数的多值性),这显然是不现实的。
猜想模块模型是一种更形象、直观的描述方法。
可将NDTM 描述成:除多了一个猜想模块(guessing module )外,NDTM 与DTM 有着完全相同的结构,而这个猜想模块带有自己的仅可对带写操作的猜想头,它提供写下猜想的方法,仅此而已。
非确定性图灵机(NDTM )示意图基于这一模型,一个NDTM 程序可以类同于一个DTM 程序的方式来进行定义,并用相同的记号(包括带中字符集Γ,输入字符表∑,空白符号b ,状态集Q ,初始状态0q ,两个停机状态Y q 和N q ,以及状态转移函数},{}),{\(:r l Q q q Q N Y ⨯Γ⨯→Γ⨯δ猜想模块 有限状态控制器 … -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 … 猜想头 读写头但对于一个输入*∑∈x ,NDTM 程序的计算却与DTM 程序的不同,它把计算分为两个阶段:猜想阶段和检验阶段。
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?这个问题至今还未解决。