简化布尔表达式的算法

时间:2016-03-14 20:36:15

标签: algorithm math time-complexity classification boolean-expression

我想简化表格的一个非常大的布尔函数:

f(a1,a2,....,an)= (a1+a2+a5).(a2+a7+a11+a23+a34)......(a1+a3+an).

''是指OR

' +'意味着和

可能有100个这样的术语('。'彼此) n的值可能高达30。

有没有可行的算法来简化这个?

注意:这不是实验室作业,是粗略集规则生成项目的一小部分,其中f是相异函数。

3 个答案:

答案 0 :(得分:4)

众所周知的方法是:

第二种方式最常用于计算机上。这是表格和直截了当的。第一种方法是手工操作的最佳方式,更有趣,但你不能可靠地将它用于4个以上的变量。

答案 1 :(得分:0)

典型的方法是使用boolean algebra将语句缩减为最简单的形式。

例如,如果您有类似的内容:

(A AND B) OR (A AND C)

您可以将其转换为更简单的形式:

A AND (B OR C)

答案 2 :(得分:0)

如果您将a值表示为intlong,其中a1的值为2,则a2的值为4,a3的值为8等。

int a =(a1?2 ^ 1:0)+(a2?2 ^ 2:0)+(a3?2 ^ 3:0)+ ...;

(为了保持简单而浪费一点,忽略了a0 = 1会让你感觉更好的事实)

您对所有条款都这样做:

long[] terms = ...;
terms[0] = 2^0 + 2^3 + 2^5           // a1+a2+a5
terms[1] = 2^2 + 2^7 + 2^23 + 2^34   // (a2+a7+a11+a23+a34)

然后你可以找到结果:

foreach(var term in terms)
{
   if (a & term == term) return true;
}
return false;

但这只适用于n = 64。在它之上它很乱。