具有特殊局部性质的一个3SAT问题实例的线性时间复杂度的分治求解

首先,什么是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)

综上,问题得到一个线性时间复杂度的解。

从这个问题可以看出,对于问题的划分在分治法中相当重要,问题一旦划分得当,求解就很显然了。

由于老师说他们也没做出来线性时间复杂度的解,所以算法的正确性有待检验,是否可以简化也是一个问题。

 

这是很久以前写的,说实话,因为配图没有传上来,导致我自己现在也看不懂了,但是可以确定的是这个思路是没问题的,当时跟老师交流了很久。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值