Какой самый быстрый способ проверить наличие набора?


24

Даны n подмножеств S1,,Sn из {1,,d} .

Проверьте, есть ли множества Si,Sj с SiSj . (Если так, найдите пример, если нет, просто скажите «нет»)

Тривиальное решение этой проблемы проходит через все пары наборов и проверяет включение для пары за время O(d) , поэтому общее время выполнения равно O(n2d) . Можно ли решить эту проблему быстрее? Есть ли название для этого в литературе?

Ответы:


27

Вы не можете решить это за 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)


Большое спасибо за быстрый ответ. У нас даже есть , если мы сначала используем лемму о разрежении, верно? d=O(n)
Карл

9

Если вас интересуют семейства множеств с , то другое решение, концептуально очень похожее на то, которое было изложено в ответе Ювала, - это вычисление дзета-преобразования.n=ω(2d/2)

fζ(T)=STf(S),

где - функция индикатора входного семейства F = { S 1 , S 2 , , S n } . То есть f ( S ) = 1, если S F и f ( S ) = 0 в противном случае. Ясно, что существуют множества S iS j такие, что S iSf:2[d]RF={S1,S2,,Sn}f(S)=1SFf(S)=0SiSj тогда и только тогдакогда F ζ ( S ) > 1 для некоторого S F .SiSjfζ(S)>1SF

Дзета-преобразование может быть вычислено за время с использованием алгоритма Йейтса, см., Например, Knuth's TAOCP, vol. 2, §4.6.4. Сам алгоритм представляет собой довольно простое динамическое программирование, и его легко изменить, чтобы привести пример включенного набора, если таковой существует.O(d2d)


Это намного проще, чем мой ответ!
Юваль Фильмус

8

Эта проблема может быть решена с помощью алгоритма быстрого умножения матриц, и я также подозреваю, что он вычислительно эквивалентен умножению матриц (хотя я не знаю ни одного способа доказать это, и я не думаю, что методы для доказательства этого существуют ). Это решение будет иметь время выполнения 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, но я даже не уверен в этом. Тем не менее, проблемы, которые кажутся связанными с умножением матриц, редко имеют комбинаторные алгоритмы, которые лучше, чем наивный алгоритм (больше, чем полилогарифмические факторы), поэтому, если бы мне пришлось угадывать, я бы предположил, что для вашей задачи не существует хорошего алгоритма, который значительно лучше, чем наивный, используя современные методы.


6

n>(dd/2)2dπd/2n

f[m]O(m2m)ff

Σ=x,yfS(x,y),
S(x,y)0x,yS(x,y){(xi,yi):i[d]}xiix

f,gΣ=xf,ygS(x,y)pf,gp(0,1/2)Σ=xT(x)f^(x)g^(x)T(x)x

F={Si{x}:i[n]}{Si¯{y}:i[n]}.
Si{x}Si¯{y}S(x,y)ΣSi{x}Sj¯{y}SiSj¯=SiSjS1,,Sn
Σ=i=1nS(Si{x},Si¯{y}).

O~(n+2d)dn2dO~(n2)n=ω(2d/2)

SiSjS1,,SnG1,G21/2SiSjG1G2O(logn)SiSj

n=2kkxyO(nd)O(log2n)


Интересный. Что я должен прочитать, если я хочу узнать больше об этом?
Янне Х. Корхонен

2
Проверьте работу Фридгута «О мере пересекающихся семейств, уникальности и устойчивости».
Юваль Фильмус
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.