Далее приведен алгоритм, который использует приблизительно времени и 2 n / 2 пространства.2n2n/2
Во-первых, давайте рассмотрим проблему сортировки сумм всех подмножеств элементов.n
Рассмотрим эту подзадачу: у вас есть два отсортированных списка длины , и вы хотели бы создать отсортированный список попарных сумм чисел в списках. Вы хотели бы сделать это примерно за O ( м 2 ) времени (выходной размер), но сублинейное пространство. Мы можем достичь O ( м ) пространства. Мы сохраняем приоритетную очередь и извлекаем суммы из приоритетной очереди в порядке возрастания.mO(m2)O(m)
Пусть списки будут и b 1 … b m , отсортированные по возрастанию. Мы берем m сумм a i + b 1 , i = 1 … m и помещаем их в очередь с приоритетами.a1…amb1…bmmai+b1i=1…m
Теперь, когда мы вытаскиваем наименьшую оставшуюся сумму из очереди приоритетов, если j < m, мы помещаем сумму a i + b j + 1 в очередь приоритетов. В пространстве преобладает очередь с приоритетами, которая всегда содержит не более m сумм. И время O ( m 2 log m ) , так как мы используем O ( log m ) для каждой приоритетной операции очереди. Это показывает, что мы можем сделать подзадачу в O ( м 2ai+bjj<mai+bj+1mO(m2logm)O(logm) время и O ( m ) пространство.O(m2logm)O(m)
Теперь, чтобы отсортировать суммы всех подмножеств из чисел, мы просто используем эту подпрограмму, где список a i является набором сумм подмножеств первой половины элементов, а список b i является набором сумм подмножеств второй половины предметов. Мы можем найти эти списки рекурсивно с помощью того же алгоритма.naibi
Теперь рассмотрим исходную проблему. Пусть будет набором координат , равным 0 , а S 1 будет набором координат, равным 1 . Тогда
Π я ∈ S 0 р ( v я = 0 ) Π я ∈ S 1 р ( v я = 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)).
Сортировка этих чисел такого же , как сортировка числа , так что мы свели задачу к сортировке суммы подмножеств п элементов.∑i∈S1logp(vi=1)−logp(vi=0)n