首先,什么是3SAT问题。
对于不具有特殊局部性的3SAT问题,我们显然无法给出一个线性复杂度的算法来对其进行求解。以下是一个3SAT问题实例描述:
布尔公式中包含n个变量,每个变量以1,2,.....,n进行编号,公式中的每个子式包含变量的编号差异在10以内。
首先,我们对其进行divide:
对于任意一个子式,问题条件可转化为
我们以其中的最小下标作为分组依据,即分成最小下标为1的组,最小下标为2的组,最小下标为3的组……直至无法在分,此步时间复杂度为O(n)
在这里,我将最小下标十个一组进行划分,即按最小下标(0,10),(10,20),(20,30)……进行划分。(因为考虑到后续conquer的时候的便利性)
则每一组对应的变量下标范围为 (0,20),(10,30),(20,40)……
conquer:
以(0,10)分组为例
我们将其全部遍历(true,false),看是否存在解,(最多)进行1024次
如果不存在解,则在下一个分组遍历时(即在(10,20)处)观察是否存在满足他的解,如果存在,则(0,10)分组有解,否则此3SAT问题无解。
此步时间复杂度为O(n)
combine:
将所有的解合并,即为最终结果。
此步时间复杂度为O(n)
综上,问题得到一个线性时间复杂度的解。
从这个问题可以看出,对于问题的划分在分治法中相当重要,问题一旦划分得当,求解就很显然了。
由于老师说他们也没做出来线性时间复杂度的解,所以算法的正确性有待检验,是否可以简化也是一个问题。
这是很久以前写的,说实话,因为配图没有传上来,导致我自己现在也看不懂了,但是可以确定的是这个思路是没问题的,当时跟老师交流了很久。