logic - 通用编程逻辑

标签 logic mathematical-optimization

我有一个一般性问题 - 关于值的测试,我多次遇到这个问题,最后我用一些难看的长代码来完成一些逻辑上看起来简单的事情。

问题 - 我有一个或多个值,我想针对其他值进行测试....这样我的代码最终看起来像这样(概念上)

IF (A > B 
AND A < C 
AND A < D
AND A < E)
THEN print "Yes"

从逻辑上讲,我可以将其表达为 IF A > b,c,d,e etc.

如果我还需要检查该列表中的其他值 - 您可以看到要测试的条件语句可能会变得比条件旨在产生的代码大得多和困惑......

必须有一种有问题的或数学上的方法来表达这个常见的实例。

我知道每种语言都有针对此的“语法”特定方法,但是..我会采纳建议并尝试。

最佳答案

您在这里有两个问题:1) 是否有更简洁的方法来编写这段代码? 2) 这在计算上是否有效?

murgatroid99 和 τεκ 都对如何生成更简洁的代码给出了很好的答案。但是这两种方法实际上(至少从表面上看,假设编译器没有在底层进行优化)计算效率较低。

想想看:语句if a > max(b,c,d,e)告诉系统调用 max() —— 它会添加到堆栈、复制参数等。调用可能会以一种或另一种方式内联,所以你并不是在谈论性能的巨大损失,但有一些开销. max() 函数必须将每个数字与其他数字进行比较,需要 O(n) 的时间才能完成。

另一方面,你最初写的声明,IF (A > B AND A < C AND A < D AND A < E)将在第一次遇到不计算为真的比较时短路。所以你真正想要的,如果你清理这段代码,是一个做同样事情的函数。有点像

boolean smallerThanElements(int a, int[] elements) {
    for (int elt : elements) {
        if (a > elt) return false;
    }
    return true;
}

现在您的列表可以增长到任意大小,但仍会短路。函数调用仍有一些开销,但您已将预期性能降低到 O(n/2)(最佳情况 O(1) 和最坏情况 O(n) 的平均值)。并将您的 if 语句简化为 if (a > b AND smallerThanElements(a, eltArray)) .

关于logic - 通用编程逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6216711/

相关文章:

r - 尝试使用optim()进行约束优化时出现错误

python - pyomo 生成具有大量约束的模型的性能

c# - 最终输出中的额外零是从哪里来的?

java - Java ATM 项目中使用 If 语句进行切换

r - 通过优化创建因素组合

r - 最小化投资组合方差,限制为与基准投资组合足够相似

python - 使用 Gekko 划分楼层

python - 使用上述值简化数据框列部分的有效方法

php - 具有 "weighted"条边的 Ford-Fulkerson 算法

java - 如何用Java解决这个国际象棋骑士问题?