【问题标题】:Java: minimum number of operations for conjunctive inequalities?Java:联合不等式的最小操作数?
【发布时间】:2011-02-13 14:46:55
【问题描述】:

我尝试简化条件:

for ( int t=0, size=fo.getPrintViewsPerFile().size();
          t<size && t<countPerFile;
          t++)
{
    // ...
}

,更准确地说:

t<s && t<c

您需要比较两次,然后从中计算布尔值。有没有更简单的方法来做到这一点?如果不是,你怎么证明?我可以在某种程度上简化它,proof tree.

[已添加]

我尝试通过逻辑直接解决问题。看看选择最小值的含义会​​很有趣。链接:

http://www.umsu.de/logik/trees/?f=(\exists%20s%20\exists%20c%20\forall%20t%20%20(Pts%20\land%20Ptc))\leftrightarrow\neg(\foralls\forallc\existst(\否定(Pts)\lor\neg(Ptc)))

【问题讨论】:

  • 一两个星期前问过完全相同的问题。实际上,经常。我只是找不到它:) 答案至少可以归结为“不,忍受它”。有一些方法可以让它更短/不同,但不会更快。
  • @HH:您证明的公式只是量化了德摩根定律 (en.wikipedia.org/wiki/De_Morgan%27s_laws)
  • BalusC:注意到某些重复性:stackoverflow.com/questions/2316084/…。显然,有些事情是永恒的:)

标签: java math for-loop conditional predicate


【解决方案1】:

忘记它。如果您正在处理打印或文件,这种微优化几乎不会为您节省任何费用。

【讨论】:

    【解决方案2】:

    您可以使用t &lt; Math.min(s, c),但这实际上不会减少比较次数。

    不过,我确实认为适当使用 Math.minMath.max 会使代码更具可读性。不幸的是,它们只有 2 个 args 的重载(intlongfloatdouble 参数)。如果它们也有 3 个 args 和 varargs 重载,那就太好了。

    你总是可以为这些事情编写实用程序方法(间隔检查是一个常见的习惯用法(minV &lt;= v) &amp;&amp; (v &lt;= maxV) 等),但是语言上,没有任何 Java 没有任何花哨的运算符可以做到这些事物。它们只有基本的数值比较运算符(JLS 15.20.1)和基本的布尔运算符(JLS 15.22.215.2315.24)。


    旁注

    Icon 这样的高级语言确实允许这些类型的结构:

    Java                      Icon
    (x < v1) || (x < v2)      x < (v1 | v2)
    (a < b) && (b < c)        a < b < c
    

    【讨论】:

    【解决方案3】:

    如果sizecountPerFile 在循环期间保持不变,您可以在循环之前预先计算它们的最小值,然后测试将是t&lt;minimum

    int size=fo.getPrintViewsPerFile().size();
    int minLimit = Math.min(size, countPerFile);
    for (int t=0; t<minLimit; t++) {
        ....
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-23
      • 2016-08-01
      • 2021-03-27
      • 1970-01-01
      • 2021-12-20
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多