关灯
护眼
字体:大 中 小
上一页
目录
下一页
,它是一个绝对正确的排序网络,当且仅当,它能够极其正确地将所有仅仅由数字0和数字1构成的有限输入串行,完全排好序。
这条定理的杀伤力在于,它无情地斩断了无限与有限的边界。
不会要求你去检验全部的120种排列,也不要求你往这段排序代码里喂进任何一个带有具体数值的实际输入。
它只要求你检验那些由0和1拼凑出来的二进位串行。
对于sort5(五个位置),根据零一原理,可以看做每个独立的位置上,要么是绝对的0,要么是绝对的1(非 0 即 1)。
于是,它的
只要你写出的这段代码网络,能够正确无误地把这三十二个全由0和1构成的串行排成单调递增的型状
那么,神奇且绝对的是,这段比较网络,对任何来自同一全序类型的五个输入都正确。
原本的微小的120,被再次降维压成了32。
如果是十六个数,原本极其恐怖的二十万亿,也能压缩成六万五千个。
一个微处理器闭着眼睛都能跑完的数字。
更重要的是,这三十二个简陋的0-1串行,还不是软件工程里充满玄学的抽样测试,也绝对不是测试工程师绞尽脑汁想出来的边界测试用例。
它在数学意义上,是不留死角的完备检查。
只要顺利地跑通这三十二个简单的串行,这段代码底层的绝对正确性,就被焊死在了真理的铁板上。
这种利用抽象的数学定理斩杀无限状态空间的快感,简直太美妙。
江临立刻在MPS-Kernel根目录下新建了一个Python脚本文档。
引入,暴力地生成全部确定的三十二个0-1串行。
对每一个独立的串行,机械地跑一遍外部挂载的候选排序网络代码。
严格地检查输出串行是否满足单调不减。
三十二个严苛的证人,只要全部通过,程序就会返回绿色的【PROVEN VALID】(证明有效)。
而只要有任何一个微小的串行无法通过,程序就会将那个反例直接吐出来,无情地枪毙这段代码。
三十二个全过,返回已证明。
任何一个不过,把那个反例吐出来。。
绿色。
三十二个0-1证人,在严密的数学法庭上,没有一个翻供。
正确性的地基,有了。
接下来的是神仙打架的活:在所有正确的排序网络里,找出最好的那一个。
江临开始把他在铺砌几何中经过千锤百炼的MPS搜索骨架,巧妙地往这个代码问题上套。
做砖时,状态是一块局部铺砌,动作是放下一块新砖,胜利条件是排除所有拓扑逃逸。
现在呢?
状态是一段已经写下的比较器串行。
动作是往后追加一个比较器,比较两个位置,把小的甩前,大的甩后。
胜利条件,是这段串行让三十二个证人全部点头。
结构一模一样。
只是把几何换成了指令。
他写了一版搜索:从空网络出发,逐个追加比较器,每加一个就用零一原理剪枝,留下还有希望的分支,砍掉已经走死的。
搜索先跑长度八以内的全部候选。
MPS没找到任何一个能让三十二个0-1证人全部点头的网络。
然后长度放到九。
第一组通过的网络出现了。
这才意味着:五个元素排序,九个比较器不只是能做到,而是最低限度。
教科书上写了几十年的那个数字,被他这套从一块砖上长出来的框架,从头独立搜了出来。
框架,迁移成功。
江临靠回椅背,看着屏幕上那九行干净的比较器。
一瞬间,有种成了的轻飘飘然。
可这点轻飘只浮起了几秒,就被他自己一把按了下去。
重新调出陈启明那张流血的火焰图。
陈启明早就说过,人工优化的红利,已经被那群长期泡在底层代码里的人压得很薄了。
意思是他团队现有的代码,比较器数量大概率早就是九,或者贴着九。
而他用高维数学和搜索算法搜出来的最少九个比较器,对陈启明而言,根本不是什么新东西。
江临盯着自己那九行结果,眉头慢慢拧紧。
他犯了一个新手才会犯的错。
下意识地去优化了那个最干净最好定义也最容易写出适应度函数的组合目标——比较器的数量。
可陈启明要的,从来不是数学意义上的数量最少。
而是
本章未完,请点击下一页继续阅读>>『加入书签,方便阅读』
上一页
目录
下一页