Java 如何检查两个布尔表达式是否相等
我怎么知道两个布尔表达式是否相等Java 如何检查两个布尔表达式是否相等,java,boolean-logic,Java,Boolean Logic,我怎么知道两个布尔表达式是否相等 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
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)
现在我必须知道他们是否有相同的群体。一种方法是获取每个组的哈希:
表1:
表2:
因此:
我可以对每个组进行md5排序,expr哈希是所有哈希的md5
但问题是。。。我怎样才能减少开支?有算法吗?表达式仅使用AND和OR运算符
有算法吗
理论答案:
- 您试图解决的问题也称为SAT
- 是的
- 这意味着,没有已知的算法1总能在多项式时间内找到SAT问题的解决方案;i、 e.没有算法的最坏情况是
或更好,其中O(N^C)
是常数,N是SAT问题中的变量数C
- 有一个明显的解决方案是
。。。解决方案空间的暴力搜索。存在更好的算法;看,但在最坏的情况下,它们都是指数型的O(2^N)
- 对于非常小的
,暴力可以提供可接受的性能N
- 使用现有的SAT解算器,记住理论上说它在最坏的情况下具有指数行为
- 避免使用大型
。。。或者编写应用程序代码,使解算器处于“时间框”状态;i、 如果不能在规定的时间内得到解决方案,它就会放弃N
1-如果已经证明了这一点,那么更好的算法可能会出现在这个和其他NP完全问题上 有算法吗 理论答案:
- 您试图解决的问题也称为SAT
- 是的
- 这意味着,没有已知的算法1总能在多项式时间内找到SAT问题的解决方案;i、 e.没有算法的最坏情况是
或更好,其中O(N^C)
是常数,N是SAT问题中的变量数C
- 有一个明显的解决方案是
。。。解决方案空间的暴力搜索。存在更好的算法;看,但在最坏的情况下,它们都是指数型的O(2^N)
- 对于非常小的
,暴力可以提供可接受的性能N
- 使用现有的SAT解算器,记住理论上说它在最坏的情况下具有指数行为
- 避免使用大型
。。。或者编写应用程序代码,使解算器处于“时间框”状态;i、 如果不能在规定的时间内得到解决方案,它就会放弃N
1-如果这一点被证明,那么更好的算法可能会出现在这个和其他NP完全问题上。总之,这是一个非常大的问题。简而言之,如果你有一个神奇的算法,可以在适当的时间内以输入数据的大小来解决你的问题,同样的算法也可以处理大多数已知的计算上最糟糕的问题。是“(a或B)和C”以及“(D或E)和F”等价吗?不是@GilbertLeBlanc。在Wiki中,有用JavaScript编写的在线SAT解决方案,也许我应该开始看他们的代码。@ Gilbert Le Blanc,你在诱惑我们吗?变量是不同的,所以这相当于问x=y是否代表任何x,y。总之,这是一个非常大的问题。简而言之,如果你有一个神奇的算法,可以在适当的时间内以输入数据的大小来解决你的问题,同样的算法也可以处理大多数已知的计算上最糟糕的问题。是“(a或B)和C”以及“(D或E)和F”等价吗?不是@GilbertLeBlanc。在Wiki中,有用JavaScript编写的在线SAT解决方案,也许我应该开始看他们的代码。@ Gilbert Le Blanc,你在诱惑我们吗?变量是不同的,所以这相当于问x=y是否代表任何x,y。我不相信这是正确的。问题是关于布尔公式(共NP完全)与SAT(NP完全)的等价性。只要P=!NP,这意味着这个问题不可能是NP完全的(然而,它也意味着它不可能在P中)。我不相信这是正确的。问题是关于布尔公式(共NP完全)与SAT(NP完全)的等价性。只要P=!NP,这意味着这个问题不可能是NP完全的(然而,它也意味着它不可能在P中)。
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")
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") ))