Возможно, это микрооптимизация, хотя я сомневаюсь, что это будет иметь какое-то значение с современной JVM. (Если это стоящая оптимизация, оптимизатор JIT-компилятора, вероятно, выполнит эквивалентное преобразование на уровне нативного кода.)
Возможно, это также (неправильная) попытка заставить код работать, если имеется несколько потоков , Я говорю «неправильно», потому что программист игнорирует требования модели памяти Java. Поскольку до не было ясных отношений между двумя потоками, обращающимися к переменной persons
или списком, на который она ссылается, потоки склонны видеть устаревшие данные, что приводит к непредсказуемому поведению.
Могут быть другие причины для этого, которые не очевидны в вашем примере. (Например, если persons
было объявлено как volatile
и были выполнены некоторые другие предварительные условия, это могло бы быть потокобезопасным, а предположительно избыточная локальная переменная могла бы иметь действительную) цель.)
Вы не можете уменьшить" (a ИЛИ b ИЛИ d) И (a ИЛИ c)" к" (a ИЛИ b ИЛИ d ИЛИ c)", потому что первый не удовлетворен "c=true, a, b, d=false", тогда как последний. Таким образом, Вы не можете доказать, что сокращение исправляет также :)
В целом существует много способов уменьшить булевы формулы в размере, и это - также вопрос того, что Вы хотите оптимизировать (общий размер? среднее количество оценок условия?). Karnaugh отображает работу только для небольшого количества переменных. Сокращение большой булевской переменной formulaes в меньшие является усовершенствованной темой, которая является ключом, например, автоматическим дизайном логического канала.
Карта Karnaugh является Вашим другом здесь:
http://en.wikipedia.org/wiki/Karnaugh_map
Необходимо будет отчасти создать его наоборот из вышеупомянутых уравнений, но это - хороший инструмент, чтобы сказать Вам, если это может быть уменьшено далее.
a или {(b ИЛИ d) И c}
Обоснование: Если "a", то оператор верен. еще, Вам нужны b или d (для удовлетворения первой части оператора), и c (удовлетворяет вторую половину для случаев когда! a
Карты Karnaugh, ключ должен "потянуть" все возможные исходные данные и указать на их выводы. Затем можно начать отфильтровывать исходные данные, которые не имеют значения к выводу, таким образом уменьшающему карту. После того как это оптимизировано, можно затем произвести логику из него.
Используя карты Karnaugh:
Это - a ИЛИ b ИЛИ d:
\ab cd\ 00 01 11 10 ---+-----------+ 00 | | X| X| X| 01 | X| X| X| X| 11 | X| X| X| X| 10 | | X| X| X| +-----------+
Это - a ИЛИ c:
\ab cd\ 00 01 11 10 ---+-----------+ 00 | | | X| X| 01 | | | X| X| 11 | X| X| X| X| 10 | X| X| X| X| +-----------+
Пересекая их, мы добираемся:
\ab cd\ 00 01 11 10 ---+-----------+ 00 | | | X| X| 01 | | | X| X| 11 | X| X| X| X| 10 | | X| X| X| +-----------+
Очевидно, это - a ИЛИ (что-то), где (что-то):
00 01 11 | X| X| 10 | | X|
Начиная с (чего-то) не прямоугольник, требуется два выражения, которые могли быть или AND'ed или OR'ed вместе, в зависимости от того, как мы хотим приблизиться к нему. Мы будем использовать ИЛИ в этом примере, так как он дает более простое выражение.
В этом случае мы можем сгруппировать два X друг рядом с другом с еще два для заполнения всей строки CD, таким образом, CD может быть одним из выражений. Мы можем также сгруппировать два друг на друге с двумя с правой стороны от них для формирования квадрата. Этот квадрат представляет выражение до н.э, так как и a и d варьируются в квадрате.
Таким образом, заключительное выражение является a ИЛИ ((c И d) ИЛИ (b И d)), или + CD + бод. Намного более хороший, не так ли?
(a ИЛИ b ИЛИ d) И (a ИЛИ c)
Это означает, когда верного, все верно!
=> a ИЛИ {(b ИЛИ d) И (c)}
=> a ИЛИ (b И C) ИЛИ (d и C)
я думаю, что результат (a ИЛИ b ИЛИ d ИЛИ c) является неправильным, но дайте мне руку когда ее несправедливость.
Да, можно доказать его. Вы не можете уменьшить его до (a ИЛИ b ИЛИ d ИЛИ c)
Посмотрите на 3-ю строку ниже. Вашему сокращению не удалось бы генерировать надлежащий ответ.
Просто прокручивать это:
B C D
0 0 0 0 = 0
0 0 0 1 = 0
0 0 1 0 = 0
.
.
.
1 0 0 0 = 1
1 0 0 1 = 1
До сих пор я имею (A ИЛИ (???)) :(