Java: минимальное количество операций для конъюнктивных неравенств? - PullRequest
0 голосов
/ 29 апреля 2010

Я пытаюсь упростить условные выражения в:

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

, точнее:

t<s && t<c

Вам нужно сравнить два раза, а затем вычислить логическое значение из них. Есть ли более простой способ сделать это? Если нет, то как вы можете это доказать? Я могу упростить это до некоторой степени, дерево доказательства.

[Добавлено]

Я пытался решить проблему напрямую с помощью логики. Было бы интересно увидеть значение при выборе минимумов. Ссылка:

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(\neg(Pts)\lor\neg(Ptc)))

Ответы [ 3 ]

3 голосов
/ 29 апреля 2010

Если size и countPerFile являются постоянными на протяжении цикла, вы можете предварительно рассчитать их минимум до цикла, и тогда тест будет t<minimum.

int size=fo.getPrintViewsPerFile().size();
int minLimit = Math.min(size, countPerFile);
for (int t=0; t<minLimit; t++) {
    ....
1 голос
/ 29 апреля 2010

Забудьте об этом. Если вы имеете дело с печатью или файлами, такая микрооптимизация практически ничего не спасет.

1 голос
/ 29 апреля 2010

Вы можете сделать t < Math.min(s, c), но это не уменьшит количество сравнений.

Я думаю, что правильное использование Math.min и Math.max делает код более читабельным. К сожалению, они имеют перегрузки только для 2 аргументов (для аргументов int, long, float и double). Было бы здорово, если бы у них было 3 перегрузки args и varargs.

Вы всегда можете написать метод утилит для такого рода вещей (проверка интервала является обычной идиомой (minV <= v) && (v <= maxV) и т. Д.), Но лингвистически , ни в одной Java нет таких причудливых операторов, которые бы выполняли эти вещи , Они имеют только базовые операторы числового сравнения ( JLS 15.20.1 ) и базовые логические операторы ( JLS 15.22.2 , 15.23 , 15.24 ).


Sidenote

Языки более высокого уровня, такие как Icon делает допускающими следующие типы конструкций:

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