【发布时间】:2019-12-08 14:11:42
【问题描述】:
我正在尝试为以下问题找到一个很好的解决方案:
我的输入是一组布尔变量 b0 到 bn 和
一组if 语句调用某个函数以防表达式(我的布尔变量的结合)为真。
例如:
void test(bool b0, bool b1, bool b2, bool b3, bool b4) {
if(b0&&b1) { action1(); }
if(b0&&b1&&b3) { action2(); }
if(b0&&b1&&b4) { action2(); }
if(b0&&b2) { action3(); }
}
显然可以优化此代码以尽量减少比较次数。
例如:
void test(bool b0, bool b1, bool b2, bool b3, bool b4) {
if(b0) {
if(b1) {
action1();
if(b3) { action2(); }
if(b4) { action2(); }
}
if(b2) { action3(); }
}
}
是否有解决/优化此问题的算法(甚至可能以最佳方式)?
很明显,它可以表示为图形、表格等,但不知何故我仍然找不到聪明的解决方案。
更新:我认为我没有很好地解释这个问题。将问题视为具有多个输出的真值表。输入是布尔变量,输出是动作。所以这不仅仅是可以用 KV map 或 Quine-McCluskey 算法解决的问题。猜猜它更复杂。
上面示例的表格将是(我省略了“无输出”的情况):
b0| b1| b2| b3| b4 || action1 | action2 | action3
1 | 1 | 0 | 0 | 0 || 1 | 0 | 0
1 | 1 | 0 | 1 | 0 || 1 | 1 | 0
1 | 1 | 0 | 0 | 1 || 1 | 1 | 0
1 | 0 | 1 | 0 | 0 || 0 | 0 | 1
【问题讨论】:
-
您是否检查了生成的程序集以推断“可以优化此代码以最小化比较次数”?我没有注意到godbolt.org/z/iEh9FE上的两个版本之间存在巨大差异
-
我相信他们的意思是返回动作而不是仅仅运行它们并继续。
-
@StoryTeller:感谢您的评论。我猜 gcc、clang 等已经在优化此类代码方面做得很好。这更像是一个关于如何最小化比较次数的算法问题。
-
@yukashimahuksay 这与是否退货无关。我有兴趣尽量减少比较次数。
-
我的意思是您的代码是否只执行其中一项操作,或者它可能执行其中一些操作。在后一种情况下,我认为您的代码甚至不会减少比较次数。
标签: c++ algorithm optimization code-generation compiler-optimization