科普P-NP

news/2024/7/7 19:35:50

大多数决策问题是不能用程序解决的

决策问题:对于输入的问题,它的回答要么是YES要么是NO

  • 计算机程序:计算机程序的集合是可数的。集合形如
\epsilon,0,1,00,01,10...

想想程序都是"人"一个一个写下来的,他们存在硬盘上实际也是一系列的0 1 组合,也就是说它是一个可数的数。这里需要去掉错误的程序,错误的程序本身是无法解决问题的。

\epsilon表示空串

  • 决策问题:决策函数的集合是不可数的。

每一个决策问题可以看做是一个输入是有限的字符串,输出是0 1的函数。所有的这些函数组成的集合假设他是可数的

f(\epsilon),f(0),f(1),f(00),f(01),f(10)...

所有集合的元素为 \alpha_1,\alpha_2,\alpha_3...\alpha_i,这样的构造是可以无限进行下去。定义一个新的无限长的字串:\delta=\delta_1\delta_2\delta_3..,其中

\delta_i=\lbrace^{0\space 如果(\alpha_i)_i=1 }_{1\space 如果(\alpha_i)_i=0}

其中(\alpha_i)表示原集合中的一个结果,(\alpha_i)_i表示(\alpha_i)的第i个比特。这样得到的\delta_i肯定和\alpha_i不一样,也就是说它不在集合里头,那么意味着包含所有无限字符串的集合本身是不可数的。

不可数的集合原数肯定是比可数的集合要大,这就意味着大多数的决策问题是无法用程序解决的。

证明出处,见第3小节

不可用程序解决的一个问题示例

比如最后一个进来的人把门关上,实际上每个进来的人都不知道自己是不是最后一个人,因为将来任何时候都有可能有人进来,这种情况,实际上就无法用程序的方式写下来。如果你知道一共有多少个人,那么是明白自己是否是最后一个进来的人,但关键是你不知道一共有多少个人,所以你只能让这个程序一直跑下去,但是跑不出结果

科普P和NP

  • P: 多项式时间内能够解决的问题
  • EXP: 指数时间内能够解决的问题
  • R: 能够在有限时间内解决的问题,R指recursive

halt problem,运行一段代码,它会停止吗?它在有限的时间内能够解决,只要一直运行这个程序就知道

  • NP: nondeterministic polynomial。它的答案能在多项式时间内验证。它通过某种“运气成分”的算法来在多项式时间内解决决策问题。

验证是指如果决策问题的答案是YES,能够证明它是正确的,并且证明的验证所花的时间在多项式时间之内。

所谓的运气就是说只需要一次尝试就找到了解决问题的方法。

nondeterministic model指算法本身来猜测,最终得到一个YES或者NO的回答,得到的猜测本身如果问题本身是YES,那么它的回答一定是YES

NP先关的一些概念

P!=NP: 证明问题要比验证问题要难

去证明一个问题需要很多的“灵光”一现,而验证问题只要描述的够精确,按照特定的步骤去执行,保证上下连贯,基本是没有问题。这里的“灵光”也就是说的“运气”

对于P的问题可以在任何计算机上面做实现,但是NP需要机器能够神奇的知道那种方法能够获得正确的解答。而这种机器能够神奇的知道正确答案的是不存在的。也就是说不存在"工程上的幸运"

从集合上来说就是存在这样的问题,它属于NP,但是不属于P

NP-hard: 起码和在NP里头的问题一样的难
NP-complete: NP\bigcap NP-hard

比如 俄罗斯方块问题

NP-complete问题之间都可以互相转化(reduce)

问题转换(Reduction)

转换一个问题A到一个问题B,这样表示B起码和A一样难

比如把没有权重的最短路径问题,转换成有权重的最短路径问题


http://www.niftyadmin.cn/n/835534.html

相关文章

时间戳格式化

Date.prototype.format function (fmt) {var o {"M": this.getMonth() 1, //月份"d": this.getDate(), //日"h": this.getHours(), //小时"m": this.getMinutes(), //分"s": this.getSeconds(), //秒"q": Math…

JS—操作符(二)

1.比较运算 ——又叫关系运算符 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-…

JmsTemplate sendAndReceive 设置超时

通过调用sendAndReceive方法&#xff0c;实现发送消息之后可以同步接收返回信息。 Message replyMsg this.jmsQueueTemplate.sendAndReceive(new MessageCreator(){Overridepublic Message createMessage(Session sn) throws JMSException {TextMessage txtMsg sn.createText…

Redis Labs 再次更改开源许可证,但 Redis 本身不受影响

其实「Redis Labs 再次更改开源许可证」这个说法有标题党的嫌疑&#xff0c;但看到 Redis Labs 的 CTO 也表示这次的变更确实是关于许可证的变更。既然如此&#xff0c;那就顺道借题发挥一下吧&#xff0c;还请各位轻喷。 △ Redis Labs 的官方公告 https://redislabs.com/blog…

Python--day38--JoinableQueue解决生产者消费者模型

############################# # 在消费者这一端&#xff1a;    #每次获取一个数据    #处理一个数据    #发送一个记号&#xff1a;标志一个数据被处理成功#在生产者这一端&#xff1a;  #每一次生成一个数据  #且每一次生产的数据都放在队列中  #在队列中…

黑客帝国装逼的代码雨

在桌面新建一个.txt文件&#xff0c;把下面代码放进去&#xff0c;再把后缀名改成.html&#xff0c;双击打开就好了 <!DOCTYPE html> <html> <head><title>黑客帝国</title> </head> <body> <canvas id"canvas">&l…

如何将数组数据写入文件

使用file_put_contents()将数组数据写入文件 $arr array( name>李逵&#xff0c; age>99, sex>男 ) $str var_export($arr,TRUE); 文章来源&#xff1a;刘俊涛的博客 地址&#xff1a;http://www.cnblogs.com/lovebing 欢迎关注&#xff0c;有问题一起学习欢迎留言、…

Android Bundle详解

1.Bundle简介&#xff1a; Bundle主要用于传输数据&#xff0c;它保存的数据&#xff0c;是以key-value的形式存储的。Bundle常用于在Activity间传递数据 &#xff0c;当不bundle传递的是对象或对象数组时&#xff0c;必须实现Serializable或Parcelable接口&#xff0c;下面分别…