В одной прикладной задаче мне довелось работать с множеством, размер которого был порядка 10000 элементов. И мне приходилось его фильтровать по логическому условию. Это были товары и условия были такие например: выбрать синие товары , которые поставляются от поставщика Z и при этом не являются импортными, но на которых налоговая льгота не распространяется.
Дело в том, что размер выборок, с утвердительным условием был достаточно мал, а выборка по НЕ как раз и занимала почти весь объем множества. Чтобы съэкономить время, я использовал отрицательные множества, возможно и вам пригодятся.
Итак: Отрицательное множество содержит в себе все элементы множества, за исключением указанных элементов.
Например, если есть множестово A,B,C,D,E,F, то отрицательное множество ~{A,B}={C,D,E,F}. Для малых множеств все прозрачно. Для больших множеств например ~{A} будет содержать все элементы множества. Оперировать таким массивом невозможно!
Соответственно логика будет следующая:
1. Пересечение обычного множества с отрицательным есть обычное
множество, состоящее из элементов, которые есть в обычном и которых нет в отрицательном.
2. Пересечение двух отрицательных множеств - есть отрицательное множество, состоящие
из объединения элементов обеих множеств.
3. Объединение двух отрицательных множеств - есть отрицательное множество, состоящее
из пересечения элементовобоих множеств.
4. Объединение отрицательного множества с обычным - есть отрицательное множество,
состоящее из элементов отрицательного множества, которого нет в обычном.
5. Отрицание отрицательного множества - есть обычное множество из тех же элементов,
что в отрицательном.