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

时间:2014-08-05 07:20:40

标签: algorithm compiler-optimization compiler-construction

假设我们有一个像

这样的表达式

(Rule1 && Rule2 && Rule3)

Rule1Rule2Rule3REST次调用,返回true或false。

我想根据表达式优化REST调用。 在引用的示例中,如果规则中断,则无需评估其他规则。

如果是(Rule1 ||Rule2 || Rule3) 我想立即解雇所有人,或者试图让第一个真实,然后忽略其他人。

这是编译器评估布尔表达式的方式。如果我必须用Java或任何现代编程语言实现它,我们是否有任何标准算法

1 个答案:

答案 0 :(得分:1)

大多数现代语言支持short-circuit evaluation,仅在第一个参数不确定整个表达式时才评估第二个参数。因此,在(Rule1 && Rule2 && Rule3)中,如果Rule1为false,则不会评估Rule2。同样在(Rule1 ||Rule2 || Rule3) 如果Rule1为真,则不会评估Rule2。

确定"第一个参数"的惯例是从左到右。这是因为大多数现代编程语言仍然遵循西方的写作规则。所以"算法"减少浪费的周期是:

  • for boolean AND最左边的参数应该是最有可能为false的,第二个参数最可能是false,依此类推
  • for boolean OR最左边的参数应该是最可能的,第二个参数yadda yadda

我们如何确定哪个参数最有可能是假的?根据我们对系统的信息,运用我们的技能和判断力。或者猜测我们是否没有足够的信息。这可能是一个容易premature optimization的区域。

最后,要解决这个问题:

  

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

您需要将表达式写为

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