【问题标题】:general programming logic通用编程逻辑
【发布时间】:2011-06-02 15:31:14
【问题描述】:

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

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

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

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

如果我还需要检查该列表中的其他值 - 您会看到要测试的条件语句可能会比条件预期产生的代码大得多且混乱...

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

我知道每种语言都有特定的“语法”方法,但是..我会接受建议并尝试它们。

【问题讨论】:

  • 你的两个说法不一样。第一个是A&lt;C,D,E,第二个是A&gt;C,D,E
  • 您的要求并不完全清楚。它是一种在现有计算机语言中更简洁地表达表达式的方式吗?计算机语言的假设扩展? (数学符号超出了本网站的范围。)

标签: logic mathematical-optimization


【解决方案1】:

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

murgatroid99 和 τεκ 对于如何生成更清晰的代码都有很好的答案。但是这两种方法实际上(至少从表面上看,假设编译器没有在后台优化)计算效率较低。

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

另一方面,您最初编写的语句IF (A &gt; B AND A &lt; C AND A &lt; D AND A &lt; 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 &gt; b AND smallerThanElements(a, eltArray))

【讨论】:

    【解决方案2】:

    你想要的

    如果 A > b,c,d,e

    也许

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

    这符合你的要求吗?

    【讨论】:

    • 基于第一个代码示例我认为应该是if a &gt; b and a &lt; min(c,d,e)
    【解决方案3】:

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

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

    同样对于您可以使用的代码下方的问题中的测试

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

    【讨论】:

      【解决方案4】:

      在 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 duals 来组成列表以从中选择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)) ;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多