我们是否有任何算法来优化布尔表达式



假设我们有一个表达式

(Rule1 && Rule2 && Rule3)

其中Rule1, Rule2Rule3是返回真或假的REST调用。

我想根据表达式优化REST调用。在上面引用的例子中,如果一条规则被打破,则不需要对其他规则进行评估。

(Rule1 ||Rule2 || Rule3)的情况下我想一次解雇所有人,或者试着得到第一个真实的,然后忽略其他的。

这是编译器计算布尔表达式的方式。如果我要在Java或任何现代编程语言中实现这个,我们有什么标准算法吗

大多数现代语言都支持短路求值,只有当第一个参数不能决定整个表达式时,才对第二个参数求值。所以在(Rule1 && Rule2 && Rule3)中,如果Rule1为假,Rule2将不会被评估。同样在(Rule1 ||Rule2 || Rule3)如果Rule1为真,则不计算Rule2。

确定"第一个参数"的约定是从左到右。这是因为大多数现代编程语言仍然遵循西方的编写规则。因此,最小化浪费周期的"算法"是:

  • 对于布尔AND,最左边的参数应该是最可能为假的,第二个参数应该是下一个最可能为假的,依此类推
  • 对于布尔或,最左边的参数应该是最有可能为真,第二个参数yadda yadda

我们如何判断哪个论点最有可能是假的?通过运用我们的技能和判断,基于我们对系统的了解。或者猜测如果我们没有足够的信息。这可能是一个容易过早优化的领域。

最后,要解决这个问题:

如果有一个复杂的表达式,如(Rule1 && (Rule2 || Rule3))&&Rule4,这里我将首先求值Rule4

你需要把表达式写成

(Rule4 && Rule1 && (Rule2 || Rule3))

最新更新