如何减少逻辑表达式
How to reduce logic expressions?
{
ans += (a[i] > a[j]) != (b[i] > b[j]);
//ans += ((a[i] > a[j]) && (b[j] > b[i])) || ((a[j] > a[i]) && (b[i] > b[j]));
}
你在上面看到的是我从某个地方拿来的片段。有两种逻辑表达式。据说,注释掉的那个与未注释掉的那个相同。
你如何从:
((a[i] > a[j]) && (b[j] > b[i])) || ((a[j] > a[i]) && (b[i] > b[j]))
到这样的东西
(a[i] > a[j]) != (b[i] > b[j])
有没有关于这种逻辑表达简化的指南或书籍?
这其实很简单。
对于(a[i] > a[j]) != (b[i] > b[j])
,我们要说的是,只有当与a[i]
和a[j]
的关系与从b[i]
到b[j]
的关系相反时,这才是真的。如果a[i]>a[j]
为真,那么b[i]>b[j]
为假,这意味着b[j]>b[i]
为真。这意味着当a[i]>a[j]
为真时,b[j]>b[i]
为真,它也意味着相反 - 当a[j]>a[i]
为真时,b[i]>a[j]
也是如此。
另一种说法是 ( (a[i]>a[j]) && (b[j]>a[i]) ) || ( (a[j]>a[i]) && (b[i]>b[j])
.只有在( (a[i] > a[j]) ) != (b[i] > b[j])
为真的相同情况下,布尔逻辑才是正确的。
再举一个例子,考虑何时a[i] > a[j]
和b[i] > a[j]
。在这种情况下,您将看到您发布的第一个术语为 false,因为!=
两侧的两个术语的计算结果为 true,这意味着!=
的计算结果为 false
。这种情况还会导致第二个语句解析为 false,因为||
评估为 true 的两个项中的任何一个都没有,它们都计算为 false。
最后,这个问题对我来说看起来像家庭作业 - 如果是,你应该使用适当的标签。
然而,这一切都忽略了a[i] == a[j]
或b[i] == b[j]
的可能性,这个问题的另一个答案表明这可能导致两个陈述不计算同一件事。但是,如果您假设两者不能相等,那么按照上面演示的逻辑,您的问题中的两个陈述将是相同的。
如果您假设您发布的代码是正确的
!(p > q) == (p < q)
这意味着出于某种原因,你忽略了平等。
考虑到这一点,让我们说:
a1 = a[i]
a2 = a[j]
b1 = b[i]
b2 = b[j]
然后你有:
ans += ((a1 > a2) && (b2 > b1)) || ((a2 > a1) && (b1 > b2));
由于我们忽略了平等,因此与:
ans += ((a1 > a2) && !(b1 > b2)) || (!(a1 > a2) && (b1 > b2));
如果你仔细观察,你会发现表达式是重复的,所以可以简化它们:
A = a1 > a2
B = b1 > b2
然后:
ans += (A && !B) || (!A && B);
这意味着 A 或 B,但不能两者兼而有之这是一个已知的布尔运算,称为 XOR,在您的情况下,它与不同的 (!=)
相同因此:
ans += A != B;
并扩展:
ans += (a1 > a2) != (b1 > b2)
所以:
ans += (a[i] > a[j]) != (b[i] > b[j])
希望现在清楚了。
这些表达式不等效。
例如,当 a[i] == a[j]
和 b[i] > b[j]
时,第一个表达式给出...
(a[i] > a[j]) != (b[i] > b[j]);
false != true
true
。而第二个给出:
((a[i] > a[j]) && (b[j] > b[i])) || ((a[j] > a[i]) && (b[i] > b[j]));
(false && false) || (false && true)
false || false
false
让我们拿这个:
((a[i] > a[j]) && (b[j] > b[i])) || ((a[j] > a[i]) && (b[i] > b[j]))
为简单起见,可以这样称呼它:
(w > x) && (y > z) || (x > w) && (z > y)
这在逻辑上不等同于:
(w > x) && (y > z) || !(w > x) && !(y > z)
因为它们可能是相等的,但它是:
(w > x) && (y > z) || !(w >= x) && !(y >= z)
因此,您可以将其简化为(w > x) == (y > z)
或(w > x) != (z >= y)
。
- (C++)分析树以计算返回错误值的简单算术表达式
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 提升精神:解析布尔表达式并简化为规范范式
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 在已经使用Git的情况下减少编译时间
- 使用正则表达式regex_search在字符串中查找字符串
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 如何减少花费的时间
- 概念中的cv限定符需要表达式参数列表
- 为什么constexpr的性能比正常表达式差
- Python中的for循环与C++有何不同
- 对于结构,表达式必须是可修改的ivalue
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 将fold表达式与std::一起用于两个元组
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 优化/减少 if 语句中的条件表达式
- 减少 std::正则表达式编译时间 C++
- C++ 和 Java 之间的表达式求值顺序有何不同
- 如何减少逻辑表达式