Далі наведено алгоритм, який використовує приблизно час та простір.2 n / 22n2n/2
Спочатку розглянемо проблему сортування сум усіх підмножин з елементів.n
Розглянемо цю підпроблему: у вас є два відсортовані списки довжиною , і ви хочете створити відсортований список парних сум чисел у списках. Ви б хотіли це зробити приблизно в час (розмір виводу), але підлінійний простір. Ми можемо досягти простору. Ми зберігаємо пріоритетну чергу і витягуємо суми з черги пріоритетів у порядку зростання.O ( m 2 ) O ( m )mO(m2)O ( м )
Нехай списки та , відсортовані у порядку зростання. Беремо суми , , і ставимо їх у пріоритетну чергу.b 1 … b m m a i + b 1 i = 1 … mа1… Амb1…bmmai+b1i=1…m
Тепер, коли ми витягуємо найменшу суму, що залишилася , з черги пріоритетів, якщо то ми ставимо суму у чергу пріоритетів. У просторі переважає черга пріоритетів, яка завжди містить не більше сум. І час - , оскільки ми використовуємо для кожної операції черги пріоритету. Це показує, що ми можемо виконати підпроблему в час та простір. j < m a i + b j + 1 m O ( m 2 log m ) O ( log m ) O ( m 2 log m ) O ( m )ai+bjj<mai+bj+1mO(m2logm)O(logm)O(m2logm)O(m)
Тепер, щоб сортувати суми всіх підмножин з чисел, ми просто використовуємо цю підпрограму, де список - це набір сум підмножини першої половини елементів, а список - це сукупність підмножини друга половина предметів. Ці списки ми можемо знайти рекурсивно за тим самим алгоритмом.a i b inaibi
Зараз ми розглянемо початкову проблему. Нехай - це набір координат, який дорівнює , а - набір координат, який дорівнює . Тоді
0 S 1 1 ∏ i ∈ S 0 p ( v i = 0 ) ∏ i ∈ S 1 p ( v i = 1 )S00S11
∏i∈S0p(vi=0)∏i∈S1p(vi=1)==∏1≤i≤np(vi=0)∏i∈S1p(vi=1)p(vi=0)∏1≤i≤np(vi=0)exp(∑i∈S1logp(vi=1)p(vi=0)).
Сортування цих чисел те саме, що сортування чисел , тому ми звели проблему до сортування сум підмножини предметів.n∑i∈S1logp(vi=1)−logp(vi=0)n