【问题标题】:How to reduce complexity of a long boolean expression?如何降低长布尔表达式的复杂性?
【发布时间】:2019-05-28 13:08:59
【问题描述】:

我有一个布尔表达式来评估,它很长,有很多不同的情况:

return (a && b && c) ||
(d && e && f) ||
...

这应该返回一个布尔值!

a, b, c, d, e 和 f 是简单的相等比较并且都是不同的。 这将持续 12 行,并给我 44 的圈复杂度

我试图查看 Map 对象以降低复杂性,但没有找到方法。

如何降低这种表达式的复杂性?

【问题讨论】:

  • "a, b, c, d, e 和 f 是简单的相等比较" 相等比较中使用的值是否与问题相关? (是否都将它们与相同的值进行比较)
  • @adiga 否,这些值与问题无关。他们都是不同的
  • @AnthonyMaffert 您返回的预期值是布尔值或组的最后一个值,其中所有值都为真,即 (a && b && c)c 如果所有值都为真
  • @CodeManiac 它期望返回一个布尔值
  • 如果没有冗余信息,你希望如何减少它们?您可以更改语法,但不能减少逻辑。您可以查看 Quine-McCluskey,但如果几乎没有重复比较,那将无济于事。编辑:@tevemadar,Carnaugh 不适用于那么多变量。如果有一对总共只有 3 个参数的子句,我们会很幸运,这大约是 Carnaught 所能做到的。

标签: javascript arrays node.js algorithm complexity-theory


【解决方案1】:

你不能降低给定表达式的复杂度。

一种较慢但可能更结构化的方法是将表达式分组并使用Array#some 评估外部数组,使用Array#every 评估内部数组短路。

return [[a, b, c], [d, e, f]].some(a => a.every(Boolean));

【讨论】:

  • 好主意,但这将产生Boolean value,而return (a && b && c) || ... 将产生价值
  • 根据 OP,这些值是 “简单相等比较”
  • @NinaScholz 我对这个问题感到困惑,这很好,因为 OP 想要布尔值作为输出
  • 既然js使用短路求值,为什么会降低复杂度呢?我什至认为它会增加执行时间(2 个不同的事情,但仍然很重要)
  • 现在在我的板凳上尝试过(只有 6 个变量),你的做法比 OP 慢 1.2 到 2.5 倍
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-16
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
相关资源
最近更新 更多