В одной прикладной задаче мне довелось работать с множеством, размер которого был порядка 10000 элементов. И мне приходилось его фильтровать по логическому условию. Это были товары и условия были такие например: выбрать синие товары , которые поставляются от поставщика Z и при этом не являются импортными, но на которых налоговая льгота не распространяется.

Дело в том, что размер выборок, с утвердительным условием был достаточно мал, а выборка по НЕ как раз и занимала почти весь объем множества. Чтобы съэкономить время, я использовал отрицательные множества, возможно и вам пригодятся.

Итак: Отрицательное множество содержит в себе все элементы множества, за исключением указанных элементов.

Например, если есть множестово A,B,C,D,E,F, то отрицательное множество ~{A,B}={C,D,E,F}. Для малых множеств все прозрачно. Для больших множеств например ~{A} будет содержать все элементы множества. Оперировать таким массивом невозможно!

Соответственно логика будет следующая:

1. Пересечение обычного множества с отрицательным есть обычное множество, состоящее из элементов, которые есть в обычном и которых нет в отрицательном.
2. Пересечение двух отрицательных множеств - есть отрицательное множество, состоящие из объединения элементов обеих множеств.
3. Объединение двух отрицательных множеств - есть отрицательное множество, состоящее из пересечения элементовобоих множеств.
4. Объединение отрицательного множества с обычным - есть отрицательное множество, состоящее из элементов отрицательного множества, которого нет в обычном.
5. Отрицание отрицательного множества - есть обычное множество из тех же элементов, что в отрицательном.