通用编程逻辑

时间:2011-06-02 15:31:14

标签: logic mathematical-optimization

我有一个普遍的问题 - 关于值的测试,我多次遇到这个问题而且我最终得到了一些难看的长代码来完成逻辑上看似简单的事情。

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

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

逻辑上我可以将其表达为IF A&gt; b,c,d,e等。

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

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

我知道每种语言都有'语法'特定的方法,但是......我会接受建议并尝试使用。

4 个答案:

答案 0 :(得分:4)

你想要

  

如果A&gt; b,c,d,e

所以也许

if a > max(b,c,d,e)

这可以达到你想要的效果吗?

答案 1 :(得分:4)

如果你想要代码中的测试,至少在python中你可以使用

if B<A<min(C,D,E):
    print "Yes"

类似于您的问题中的测试,您可以使用

代码
if A>max(B,C,D,E):
    print "Yes"

答案 2 :(得分:4)

这里有两个问题: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))

答案 3 :(得分:2)

在SQL中,经常(我不知道所有方言是否支持它)BETWEEN运算符。它需要一个上限和下限值,所以你必须做这样的事情(在Oracle 10g中工作):

select 1
from dual
where 1 between 0 and (select min(x) from (select 2 x from dual
                                           union
                                           select 3 x from dual 
                                           union
                                          select 4 x from dual)) ;

很明显,这是非常人为的,因为我必须union多个select from dual来组成列表以从中选择MIN

使用您的变量重写

select A
from some_table
where A between B and (select min(x) from (select C x from somewhere
                                           union
                                           select D x from somewhere
                                           union
                                          select E x from somewhere)) ;