Я пытаюсь работать с системой, которая имеет несколько сотен логических литералов со связями между ними в дизъюнктивной нормальной форме (например, x1 = (x2 & x3) | x4
; x2 = x5 | x6
; и т. Д.).Я хочу упростить систему, подставляя некоторые из них во все остальные (я уже знаю примерно те замены, которые можно отследить).Но до сих пор я столкнулся с очень плохим масштабированием своих структур данных.Я представляю выражение как Set
из BitSet
s, что устраняет прямые дубликаты, но я все же в конечном итоге (на вид) трачу кучу времени на создание этих наборов, потому что я хочу с готовностью удалить любые избыточные дизъюнкты - например,(x1 & x2) | (x1 & x2 & x3)
это просто (x1 & x2)
.
Есть ли лучший способ хранить или манипулировать ими, не требуя затрат O (n ^ 2) только на их создание?