Вы не можете решить это за O ( n2 - ϵ) время для любой константы ε > 0 если гипотеза сильного экспоненциального времени не ложна.
То есть, если бы мы имели такой алгоритм, мы могли бы решить N -переменной CNF выполнимость в O ( ( 2 - ϵ')N) время для некоторых ϵ′>0 . Причина в том, что мы могли бы разделить переменные на две равные части P1 и P2 из n/2 переменных каждая. Для каждой части построим семейство F1 и F2соответственно подмножества пунктов следующим образом. Для каждого назначения мы добавляем подмножество, состоящее из пунктов, не удовлетворяемых назначением. Эта конструкция работает в poly(n)2n/2 раз.
Чтобы завершить построение, отметим, что исходный экземпляр CNF имеет решение, если в имеется подмножество, F1которое не пересекается с некоторым подмножеством в F2 .
Добавляя некоторые дополнительные элементы к вашему основному набору в дополнение к элементам для каждого предложения, не так уж сложно встроить эту проблему непересекаемости в вопрос включения множеств. Вы в основном берете дополнения к подмножествам в . Чтобы убедиться, что два набора в F 1 не считаются включением, вы добавляете код из анти-цепочки на дополнительные элементы. Другой антицепочечный код (на других дополнительных элементах основного набора) используется в подмножествах F 2, чтобы убедиться, что никакие пары подмножеств из F 2 не образуют включения. Наконец, все множества, сформированные из F 1, включают в себя все элементы антицепочечных кодов F 2 .F1F1F2F2F1F2
Это вопрос включения набора в подмножества на d = p o l y ( n ) основном множестве. Аргумент в основном восходит к какой-то ранней работе Райана Уильямса (не помню, какой именно).2n/2+1d=poly(n)
Андреас Бьёрклунд
источник
Если вас интересуют семейства множеств с , то другое решение, концептуально очень похожее на то, которое было изложено в ответе Ювала, - это вычисление дзета-преобразования.n=ω(2d/2)
где - функция индикатора входного семейства F = { S 1 , S 2 , … , S n } . То есть f ( S ) = 1, если S ∈ F и f ( S ) = 0 в противном случае. Ясно, что существуют множества S i ≠ S j такие, что S i ⊆ Sf:2[d]→R F={S1,S2,…,Sn} f(S)=1 S∈F f(S)=0 Si≠Sj тогда и только тогдакогда F ζ ( S ) > 1 для некоторого S ∈ F .Si⊆Sj fζ(S)>1 S∈F
Дзета-преобразование может быть вычислено за время с использованием алгоритма Йейтса, см., Например, Knuth's TAOCP, vol. 2, §4.6.4. Сам алгоритм представляет собой довольно простое динамическое программирование, и его легко изменить, чтобы привести пример включенного набора, если таковой существует.O(d2d)
источник
Эта проблема может быть решена с помощью алгоритма быстрого умножения матриц, и я также подозреваю, что он вычислительно эквивалентен умножению матриц (хотя я не знаю ни одного способа доказать это, и я не думаю, что методы для доказательства этого существуют ). Это решение будет иметь время выполнения O (n ^ {2.373}), когда n = d, и другое время выполнения для других отношений между d и n.
Вот как вы решаете это с помощью умножения матриц: Вы записываете характеристические векторы наборов в строках матрицы n на d матрицы A, а характеристические векторы дополнений наборов в столбцах ad на n матрицы B. Вы затем умножьте A на B. Пары множеств, которые пересекаются, являются точными местоположениями произведения A * B, равными нулю.
Для лучшего времени выполнения, известного для этой проблемы, см. Статью Хуана и Пана на эту тему. Если я правильно помню, когда d станет достаточно большим, время выполнения станет очевидно оптимальным O (nd). Для n = d у вас будет время работы O (n ^ {2.373}). Для других отношений n и d вы получите другие значения. Если существует оптимальный алгоритм для умножения прямоугольной матрицы, вы получите алгоритм с временем выполнения O (n ^ 2 + nd) для вашей задачи. Я подозреваю, что нет лучшего способа, чем этот, чтобы решить вашу проблему, но я далеко не уверен.
Это решение, вероятно, не имеет практического применения, поскольку константы этих алгоритмов слишком велики. Алгоритм Штрассена может дать улучшение по сравнению с наивным решением для разумных значений n и d, но я даже не уверен в этом. Тем не менее, проблемы, которые кажутся связанными с умножением матриц, редко имеют комбинаторные алгоритмы, которые лучше, чем наивный алгоритм (больше, чем полилогарифмические факторы), поэтому, если бы мне пришлось угадывать, я бы предположил, что для вашей задачи не существует хорошего алгоритма, который значительно лучше, чем наивный, используя современные методы.
источник
источник