- 注册时间
- 2010-10-22
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 2292
- 在线时间
- 小时
|
发表于 2010-10-24 19:30:48
|
显示全部楼层
对于大变量数,比如1000个,从左向右算,首先要列出2^1000种,又如果右表达式只有一个运算ab
这将是一个灾难..............不可取。所以
我将每个变量用一个bit位来表示,这样一个字节可表示8个变量。分项的表达式中若存在该变量,则该位为1,否则为0,这样得到了以下的处理过程(对于极大的变量数,比如1000个需要用到大数来存储,相信不难,只涉及简单的逻辑运算),以下也是我脑子里模拟计算机的运算过程。不妥之处请指正。
比如下面一个比较典型的例子:
f(a,b,c,d,e)=ab+ac+abc++ae+abd+abe+bcd 其中全1的必为真
;-----------------
1.分析表达示
ab: 11000
ac: 10100
abc: 11100
ae: 10001
abd: 11010
abe: 11001
bcd: 01110
;-----------------
2.逻辑过滤
比如ab,abc,abd,abe实现只需要ab即可.
经过(n-1)*n/2次与运算,过滤。比如ab&&abc=11000&&11100=11000=ac则abc被过滤掉(清0即可),依次...
得到最基本的有效组:
ab: 11000
ac: 10100
ae: 10001
bcd: 01110
;-----------------
3.解析出每个基本项的所有有效解(不包括本身和全1(已经得到了))
比如对于ac:10100得到满足最高位为1和第3位为1的其他所有组合。
处理:
10100取反有01011再压缩1(其实就是1的个数n)
=>111=>(取1~(n-1))
=>001,010,011,100,101,110
=>扩展成01011格式有
=>00001,00010,00011,01000,01001,01010
=>与ac:10100进行或运算
=>10101,10110,10111,11100,11101,11110
这就是对于基本项ac的所有扩展解
其他类似...一遍处理完ab,ac,ae,bcd这样得到了所有扩展解,当然可能含有重复项
;-----------------
4.重复项过滤
再进过(n-1)*n/2次比较运算即可实现重复项的过滤。
完毕.
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
又如:
f(a,b,c,d)=ab+ac+bcd
;-----------------
1.分析表达示
ab: 1100
ac: 1010
bcd: 0111
;-----------------
2.逻辑过滤
ab: 1100
ac: 1010
bcd: 0111
;-----------------
3.解析
ab:1100=>
0011=>11=>01,10=>0001,0010=>1101,1110
ac:1010=>
0101=>11=>01,10=>0001,0100=>1011,1110
bcd:0111=>
1000只有一个1,无扩展解
;-----------------
4.重复项过滤
所有扩展解:
1101
1110
1011
1110
过滤后为:
1101
1110
1011
再加上基本有效组:
1100
1010
0111
再加上全1:
1111
即得到所有有效情形:
1101,1110,1011,1100,1010,0111,1111 |
|