我怎么知道两个布尔表达式是否相同?
String expr1 = "(A or B) and C";
String expr2 = "C and (B or A)";
boolean equals = areExprsEquals(expr1, expr2);
我想我应该......
例如,我得到第二步:
Expr1
(A or B) and C
Converted to:
(A and C) or (B and C)
Expr2
C and (B or A)
Converted to:
(C and B) or (C and A)
现在我必须知道是否有相同的组。一种方法是获取每个组的哈希值:
EXP1:
group 1:
(A and C)
Order:
(A and C)
Hash:
md5("a&c")
group 2:
(B and C)
Order:
(B and C)
Hash:
md5("b&c")
EXP2:
group 1:
(C and B)
Order:
(B and C)
Hash:
md5("b&c")
group 2:
(C and A)
Order:
(A and C)
Hash:
md5("a&c")
所以:
expr1: md5( sort(md5("a&c"), md5("b&c") ))
expr2: md5( sort(md5("b&c"), md5("a&c") ))
我可以执行每个组的md5,排序,并且expr哈希值是所有哈希值的md5。
但问题是......我怎样才能减少exprs?有算法吗?表达式仅使用AND和OR运算符。
答案 0 :(得分:4)
有算法吗?
理论答案:
您要解决的问题是Boolean Satisfiability Problem也称为SAT。
这是NP-complete。
这意味着,没有已知的算法 1 总能找到多项式时间内SAT问题的解决方案;即没有最坏情况为O(N^C)
或更好的算法,其中C
是常数,N是SAT问题中的变量数。
有一个明显的解决方案是O(2^N)
...对解决方案空间的强力搜索。存在更好的算法;见the Wikipedia article但在最坏的情况下它们都是指数级的。
实用解决方案:
对于非常小的N
,蛮力可能会提供可接受的表现。
使用现有的SAT求解器,记住该理论认为它在最坏的情况下具有指数行为。
避免大N
...的问题或编写应用程序代码,以便解算器按时间框排序&#34 ;;即如果它无法在规定的时间内得到解决方案,它就会放弃。
1 - 如果有证据证明P == NP,则可能会出现更好的算法以解决此问题和其他NP完全问题。