Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检查两个布尔表达式是否相等_Java_Boolean Logic - Fatal编程技术网

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)
      或更好,其中
      C
      是常数,N是SAT问题中的变量数

    • 有一个明显的解决方案是
      O(2^N)
      。。。解决方案空间的暴力搜索。存在更好的算法;看,但在最坏的情况下,它们都是指数型的

    实际解决办法:

    • 对于非常小的
      N
      ,暴力可以提供可接受的性能

    • 使用现有的SAT解算器,记住理论上说它在最坏的情况下具有指数行为

    • 避免使用大型
      N
      。。。或者编写应用程序代码,使解算器处于“时间框”状态;i、 如果不能在规定的时间内得到解决方案,它就会放弃


    1-如果已经证明了这一点,那么更好的算法可能会出现在这个和其他NP完全问题上

    有算法吗

    理论答案:

    • 您试图解决的问题也称为SAT

    • 是的

    • 这意味着,没有已知的算法1总能在多项式时间内找到SAT问题的解决方案;i、 e.没有算法的最坏情况是
      O(N^C)
      或更好,其中
      C
      是常数,N是SAT问题中的变量数

    • 有一个明显的解决方案是
      O(2^N)
      。。。解决方案空间的暴力搜索。存在更好的算法;看,但在最坏的情况下,它们都是指数型的

    实际解决办法:

    • 对于非常小的
      N
      ,暴力可以提供可接受的性能

    • 使用现有的SAT解算器,记住理论上说它在最坏的情况下具有指数行为

    • 避免使用大型
      N
      。。。或者编写应用程序代码,使解算器处于“时间框”状态;i、 如果不能在规定的时间内得到解决方案,它就会放弃



    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") ))