非枚举的属性值不合法什么意思_一个看起来很牛批实际上没什么卵用的定理(Universal SAT Algorithm)...

假设有一天,人类遇见了上帝,问了上帝一个问题:

能在多项式时间内被解决吗?上帝的回答是肯定的,但没有告诉那个人具体的解法。那么人类能根据这个信息,找到一个解决
问题的多项式时间算法吗?

答案是肯定的!!根据 Levin's Universal Search Algorithm,我们可以得出如下定理:

定理:假设存在一个已知常数

,使得
,但是不知道具体算法,那么我们可以找到一个确定的多项式时间的算法,其能在大约
时间内解决
问题。

(事实上,如果不知道这个常数

,也能设计出一个算法,就是复杂度比多项式复杂度稍微高一些)

这个是我上复杂度理论课的时候老师讲到的一个定理。看到这个定理的时候我觉得很厉害,因为我们可以假设

,然后根据定理找这么一个算法,要是没找到或者找出来的算法不对,不就知道了
吗?那这 P vs NP 问题马上就要被解决了啊!估计只是人类现在的计算速度还跟不上,但再过个几年,几十年,等计算力跟上来了,解决 P vs NP 问题不是梦想啊!

但当我看了这个定理的证明后,我的希望破灭了。在我看来,这是个典型的理论上很有用但实际上什么用都没有的定理。很大概率上,倾尽全宇宙的能量来跑这个算法,都跑不出来。

这个算法是基于 Levin's Universal Search Algorithm。各位其实不用了解这个 Levin 的东西到底是什么(其实我也不太懂),只需要知道这个算法需要包含巨大的常数。定理的证明如下:

证明:如果我们能在

解决
(指的是判断一个布尔表达式是否能被满足),那我们就能在
的时间内找到一个解(如果能被满足的话)。这个算法叫作 "Search to Decision"归约,大概思想就是假设一个变量的值是0(或者1,区别不大),然后根据这个假设的值修改原来的布尔表达式,再去算这个新的布尔表达式是否可以被满足。如果可以,说明猜对了(其实有可能0和1都可行);如果不可以,那么说明这个变量的值必须设成1。这样一共猜
次就可以了。

那现在根据我们的假设,有一个图灵机,输入是一个布尔表达式

,能在
的时间内,要么输出
的一个解,要么输出它无解。需要注意到我们只知道这样一个图灵机存在,而不知道它到底是什么样的。我们可以设计一个算法如下:

83b2a051f562ffa9ebecacdc4cadac23.png

其中接受拒绝其实就是我们算法的输出(到底

是否能被满足),是图灵机的术语。另外如果对图灵机编号感到疑惑,就想想其实图灵机本质上都能编码成字符串,而字符串是可以枚举的(从短到长枚举即可)。

算法分析:假设图灵机

是真正在
解决
问题并且输出解的那个图灵机。考虑所有长度大于
的输入
  • 如果
    可以被满足,在进行我们上述算法的时候,都会模拟到
    这个图灵机,而且这个图灵机是能在
    时间内解决问题的,所以我们的算法也可以找到这个解,并且接受。
  • 如果
    不能被满足,那么无论如何也不可能找到一个满足
    的解,我们的算法自然会拒绝。

所以我们的算法是正确的。等等,你问我对于长度小于

的输入怎么办?咳咳,注意没注意
是个常数啊?理论计算机科学家什么时候在意过常数(滑稽)。

算法运行时间(复杂度):很明显,有

次循环,一次循环跑
步,每次循环最后检查解需要花费大约
的时间(跟
比起来可忽略不计),一共就是大约
的复杂度。(事实上还需要考虑到模拟一个图灵机是有一些额外开销的,但这篇文章毕竟不是学术论文,就不在意那些不太重要的部分了)

嗯?这好像复杂度确实是对的啊。但且慢,其中有一步实要枚举图灵机。图灵机怎么枚举呢?本质上还是枚举图灵机编码,也就是枚举字符串。其实一般枚举字符串的话,我们都会按照字符串长度从小到大枚举,这样才能保证枚举到所有字符串。而一个在多项式时间内解决

问题的程序,应该会是很复杂的一个程序(如果很简单也不至于到现在人类都想不出来吧),那么其编码长度就会很长。假设其编码长度是
,那我们至少要枚举
个字符串才能枚举到它(由于有的字符串不是一个合法的编码,所以
也许到不了
这个数量级,但我们枚举的时候还是枚举的字符串,这个复杂度要考虑进去)。代入具体数字算一下:如果
(相当于说这个程序有8Kbits=1KB这么大,算是相当乐观的长度了),那么我们算法运行时间就至少在
以上了,这还仅仅是枚举图灵机的复杂度,不算模拟图灵机的时间。可惜,这个数字再怎么大,也只是个常数,不会被考虑到渐进复杂度分析中。引用我们老师的原话:“It's a HUGE constant, but still a constant.”

(upd:上面这一段略微有点问题。如果按照枚举字符串的方式枚举图灵机的话,最后的时间复杂度应该就不是多项式时间了,这段是我的一个失误。也很容易修正:可以将算法里“模拟编号为i的图灵机”改为“模拟编码为i的二进制编码的图灵机,如果不是合法编码就什么都不做”。或者,其实枚举图灵机也不一定要枚举字符串?因为只需要枚举字符集大小和状态个数,再枚举转移函数就可以了。这两种方法应该都行,只是后面一种不太容易分析其运行时间。这块还有别的想法的欢迎在评论区指出~)

OK,那这个定理讲完了。怎么样,是不是感觉被坑了?复杂度理论的世界就是这样,处处都有惊喜,而有时候这个惊喜挂在天上了,怎么够也够不到。


后记

其实如果真的能遇见上帝,而且只能问一个问题的话,我不建议大家问那个问题,因为如果上帝回答

不能在多项式时间内解决,那么我们几乎什么信息也没得到,毕竟大家都是这么认为的,确定了这个信息好像什么实质性帮助都没有。

这个定理其实让我想起了一个可计算性方面的一个定理,大概意思是说所有可以被证明的命题组成的集合是图灵可识别的。方法就是,枚举所有证明,看这些证明到底能不能证明这个命题。因为证明的本质也是字符串,字符串可以编码,所以所有证明也是可以枚举的。真是体现了一种暴力美学啊。

另外想说的是,本篇文章里面的牵扯到具体复杂度的部分可能不是很严谨。毕竟本篇文章不是学术论文,不想加一堆复杂的项来增大理解起来的难度,所以请大家多多包涵,不要对待那些数字太认真。

最后,这个专栏是叫《计算理论导引》笔记,但这个内容其实是那本书里没有的。最近我已经基本读完了那本书,开始看别的了。本来其实想发自己看的时候的笔记上来的,但觉得整理起来还是太麻烦且浪费时间了,就只发了一些比较有名的内容。以后还是会发TCS的东西,但估计跟这本书关系不大了。目前我还在想专栏到底要不要改名,改的话改成什么名字(虽然好像也没几个人在看)。如果对文章、专栏等有任何建议欢迎在评论区留言。下次文章再见!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值