Это немного веселее, когда вы пытаетесь сделать это эффективно.
Назначайте номера последовательно каждому набору, начиная с 0.
Затем, если есть столбец, который находится впо крайней мере, два разных набора, тогда номера этих двух наборов должны быть разными, а если числа разные, то двоичное представление этих чисел будет отличаться по крайней мере в одной позиции бита.
Итак:
Для каждой позиции бита b в заданных номерах (имеется их журнал (number_of_sets)):
Создатьобъединение всех наборов, у которых бит b установлен в своих номерах;
Создать объединение всех наборов, которые не имеют бит b установить в свои номера;
Пересечь эти два набора.
Создать объединение извсе эти пересечения.
Готово.Результатом является набор всех столбцов, которые отображаются как минимум в двух разных наборах.
Например, если столбец находится в обоих наборах 5 и наборе 7 , тоэто будет в пересечении для позиции бита b = 1 (значение места 2), потому что двоичные представления 5 (101) и 7 (111) отличаются в этой битовой позиции.Столбец будет объединять все наборы с номерами, у которых бит 1 выключен, и в объединении всех наборов, у которых бит 1 включен.
Общее количество требуемых операций набора: N * log (N) , где N - количество наборов.