У нас есть набор множеств A_1, .., A_n. Цель состоит в том, чтобы найти новые наборы для каждого из старых наборов.
newA_i = {a_i in A_i such that there exist (a_1,..,a_n) in (A1,..,An) with no a_k = a_j for all k and j}
Итак, это говорит о том, что мы удаляем из A_i все элементы, которые нельзя использовать для формирования кортежа (a_1, .. a_n) из наборов (A_1, .., A_n), так что кортеж не ' не содержит дубликатов.
Мой вопрос заключается в том, как быстро вычислить эти новые наборы. Если вы просто реализуете это определение, генерируя все возможные v, это займет экспоненциальное время. Знаете ли вы лучший алгоритм?
Редактировать: вот пример. Возьми
A_1 = {1,2,3,4}
A_2 = {2}.
Теперь новые наборы выглядят так:
newA_1 = {1,3,4}
newA_2 = {2}
Значение 2 было удалено из A_1, потому что, если вы выберете его, кортеж всегда будет (2,2), что недопустимо, поскольку он содержит дубликаты. С другой стороны, 1,3,4 действительны, потому что (1,2), (3,2) и (4,2) являются допустимыми кортежами.
Другой пример:
A_1 = {1,2,3}
A_2 = {1,4,5}
A_3 = {2,4,5}
A_4 = {1,2,3}
A_5 = {1,2,3}
Теперь новые наборы:
newA_1 = {1,2,3}
newA_2 = {4,5}
newA_3 = {4,5}
newA_4 = {1,2,3}
newA_5 = {1,2,3}
1 и 2 удаляются из наборов 2 и 3, потому что если вы выберете 1 или 2 из этих наборов, у вас останется только 2 значения для наборов 1, 4 и 5, поэтому у вас всегда будут дубликаты в кортежах, которые выглядеть как (_,1,_,_,_)
или как (_,_,2,_,_)
.
Эта проблема кажется сложной, но было бы здорово, если бы существовал алгоритм с полиномиальным временем.
Еще один способ взглянуть на это - изобразить наборы A_i слева и значения справа строкой, соединяющей набор и значение, если значение находится в наборе.