Предположим, что мы имеем конечную область D = {d1,.. dk}, содержащую k элементов.
Рассмотрим S подмножество D ^ n, т.е. множество наборов вида < a1,..., an > , ai в D.
Мы хотим представить его (компактно), используя S 'подмножество 2 ^ D ^ n, т.е. набор наборов вида < A1,.. An > , где Ai - подмножества D. Импликация такова, что для любого набора s 'в S' все элементы в перекрестном произведении Ai существуют в S.
Например, рассмотрим D = {a, b, c}, так что k = 3, n = 2 и кортежи S = a, b > + < a, c > + < b, b > + < b, c > .
Мы можем использовать S '= < {a, b}, {b, c} > для представления S.
Это однотонное решение также минимально, S '= < {a}, {b, c} > + < {b}, {b, c} > также является решением, но оно больше, поэтому менее желательно.
Некоторые размеры, в конкретных случаях, которые нам нужно обрабатывать: k ~ 1000 элементов в области D, n <= 10 относительно мало (основной источник сложности), | S | до больших значений > 10 ^ 6.
Наивный подход заключается в первом погружении S в область S '2 ^ D ^ n, а затем, используя следующий тест, два на два, два набора s1, s2 в S' могут быть слиты с образованием одного кортежа в S 'iff. они отличаются только одним компонентом.
например.
< a, b > + < a, c > → < {a}, {b, c} > (отличаются на второй компонент)
< b, b > + < b, c > → < {b}, {b, c} > (различаются по второй компоненте)
< {a}, {b, c} > + < {b}, {b, c} > → < {a, b}, {b, c} > (отличаются на первой компоненте)
Теперь может быть несколько минимальных S ', нас интересует нахождение любого, и приближения некоторой минимизации тоже хорошо, если они не дают неправильных результатов (т.е. даже если S' не так мало, как это может быть, но мы получаем очень быстрые результаты).
Наивный алгоритм должен иметь дело с тем, что любой новый "плавленный" кортеж может соответствовать некоторому другому кортежу, поэтому он очень сильно масштабируется на больших наборах ввода, даже если n остается низким. Для обеспечения конвергенции вам нужны сравнения | S '| ^ 2, и в любой момент, когда вы сплавляете два элемента, я в настоящее время тестирую каждую пару (как я могу улучшить это?).
Большая эффективность зависит от порядка итераций, поэтому сортировка набора каким-либо образом может быть вариантом или, возможно, индексированием с использованием хэшей, но я не уверен, как это сделать.
Императивный псевдокод был бы идеальным, или указатели на переформулировку проблемы на то, что я могу запустить решатель, действительно помогли бы.