Якщо то ми знаємо, що множина не є протирізкою за леммою Спернера, і тому версія рішення проблеми стає тривіальною. Але може бути цікавим розглянути випадок, коли близький до цього значення. нn>(dd/2)≈2dπd/2√n
Робота Фрідґута над теоремою Ерджо-Ко-Радо показує, що з огляду на характерний вектор для сімейства підмножин , можна за час виявити чи - сім'я, що перетинається (кожні два елементи перетинаються). Більш загально, його метод дозволяє обчислити
де - деяка (конкретна) відома функція, яка не є нуль, лише якщо неперервні. залежить лише від гістограми , де - показник для .[ m ] O ( m 2 m ) f f Σ = ∑ x , y ∈ f S ( x , y ) , S ( x , y ) ≥ 0 x , y S ( x , y ) { ( x i , y i ) : i ∈ [ d ] } x if[m]O(m2m)ff
Σ=∑x,y∈fS(x,y),
S(x,y)≥0x,yS(x,y){(xi,yi):i∈[d]}xii∈x
(Вбік, ми коментуємо, що його метод також працює, якщо нам дають дві родини , і ми зацікавлені в . в обох випадках нам потрібно обчислити -вище перетворення Фур'є-Уолша для довільного , а потім , де залежить лише від ваги Хеммінга .)Σ = Σ х ∈ F , у ∈ г S ( х , у ) р е , г р ∈ ( 0 , 1 / 2 ) Σ = Σ х Т ( х ) е ( х ) г ( х ) T ( x ) xf,gΣ=∑x∈f,y∈gS(x,y)pf,gp∈(0,1/2)Σ=∑xT(x)f^(x)g^(x)T(x)x
Як все це стосується проблеми, що знаходиться у вас? Розглянемо сімейство
Кожна від'єднана від кожного . Оскільки задано явно, ми можемо обчислити внесок цих пар у . Чи є ще непересічні пари? Якщо відключається від тоді і так . Отже, - це протидіюча iff
S i ∪ { x } ¯ S i ∪ { y } S ( x , y ) Σ S i ∪ { x } ¯ S
F={Si∪{x}:i∈[n]}∪{Si¯¯¯¯¯∪{y}:i∈[n]}.
Si∪{x}Si¯¯¯¯¯∪{y}S(x,y)ΣSi∪{x}Si∩ ¯ S j =∅Si⊆SjS1,…,SnΣ= n ∑ i=1S(Si∪{x}, ¯ S i ∪{y}).Sj¯¯¯¯¯∪{y}Si∩Sj¯¯¯¯¯=∅Si⊆SjS1,…,SnΣ=∑i=1nS(Si∪{x},Si¯¯¯¯¯∪{y}).
Цей алгоритм працює у часі , ігноруючи множники множників у . Коли близький до , це значно краще, ніж . Загалом, ми отримуємо поліпшення до тих пір, поки .O~(n+2d)dn2dO~(n2)n=ω(2d/2)
З огляду на те, що ми знаємо, що пара, що задовольняє існує, як ми її знаходимо? Припустимо, ми розділимо всі множини на дві групи навмання. Імовірність приблизно , множини і опиняться в одній групі. Якщо нам пощастило, ми можемо запустити наш алгоритм на та , виявити, до кого вони належать, і таким чином зменшити вдвічі кількість наборів, які нам потрібно врахувати. Якщо ні, ми можемо спробувати ще раз. Це показує, що при очікуваній кількості викликів Oracle oracle до версії рішення ми можемо знайти пару, що задовольняє .Si⊆SjS1,…,SnG1,G21/2SiSjG1G2O(logn)Si⊆Sj
Ми також можемо знецінити алгоритм. Не втрачаючи загальності, припустимо, . На кожному кроці ми розділяємо відповідно до кожного з бітів. Один з цих розділів завжди буде ставити і в одну і ту ж частину, якщо вони не мають протилежних полярностей; ми можемо перевірити це на явно, використовуючи лише операції . Це дає детермінований алгоритм, що використовує оракул виклику до версії рішення. k x y O ( n d ) O ( log 2 n )n=2kkxyO(nd)O(log2n)