我正在努力解决Java中由 AND , OR 和 NOT 运算符组成的逻辑表达式。
如果所输入的变量的布尔值是TRUE
,则程序必须输出。我已经成功完成,但是效率不够。
我当前的解决方案如下:
为表达式中的每个变量制作一个真值表,并逐行求值。
(p ∧ ¬q) ∨ (r ∧ s) ∨ (¬p ∨ u)
在上面的示例中,我将使用变量p q r s
的真值表来评估整个表达式。
现在,我正在考虑实现这样的替代解决方案: 考虑上面的例子。
我们可以注意到,即使只解决了p ∧ ¬q
部分,所有表达式都变成了TRUE
。这样可以省去3个额外变量的麻烦。
现在,我的问题是这个。如何用JAVA编程?我什至如何知道输入是否具有上述模式?还是仅是我必须对整个真值表进行评估的一种表达方式?像下面的那个
(p ∨ ¬q) ∧ (r ∨ (s ∧ (¬p ∨ u)))
答案 0 :(得分:5)
这是一个众所周知的NP完全问题,请参见Boolean Satisfiability Problem。
这意味着没有已知的多项式时间解,但是有很多> P解。
您将不得不对其进行暴力破解,并在可能的地方短路。 (例如:如果所有运算符均为or
,而您发现一个true
值则可以停止计算)