Poniżej podano algorytm, który wykorzystuje około czasu i przestrzeni.2 n / 22n2n/2
Najpierw spójrzmy na problem sortowania sum wszystkich podzbiorów elementów.n
Zastanów się nad tym podproblemem: masz dwie posortowane listy o długości i chciałbyś stworzyć posortowaną listę sum par liczb na listach. Chciałbyś to zrobić w przybliżeniu w czasie (rozmiar wyjściowy), ale w przestrzeni podliniowej. Możemy osiągnąć przestrzeń . Trzymamy kolejkę priorytetową i wyciągamy sumy z kolejki priorytetowej w kolejności rosnącej.O ( m 2 ) O ( m )mO(m2)O(m)
Niech wykazy być 1 ... a m i b 1 ... b m , sortowane w porządku rosnącym. Bierzemy m sum a i + b 1 , i = 1 … m i umieszczamy je w kolejce priorytetowej.a1…amb1…bmmai+b1i=1…m
Teraz, gdy wyciągniemy najmniejszą pozostałą sumę z kolejki priorytetowej, jeśli j < m , wówczas umieszczamy sumę a i + b j + 1 w kolejce priorytetowej. W przestrzeni dominuje kolejka priorytetowa, która zawsze zawiera najwyżej m sum. Czas to O ( m 2 log m ) , ponieważ używamy O ( log m ) dla każdej operacji kolejki priorytetowej. To pokazuje, że możemy zrobić podproblem w O ( m 2ai+bjj<mai+bj+1mO(m2logm)O ( logm ) czas i przestrzeń O ( m ) .O ( m2)logm )O ( m )
Teraz, aby uporządkować sumy wszystkich podzbiorów liczb, po prostu korzystać z tego podprogramu gdzie lista I jest zbiorem sumy podzbiorów pierwszej połowie pozycji, a lista b I jest zbiorem sumy podzbiorów drugiej połowy przedmiotów. Możemy znaleźć te listy rekurencyjnie za pomocą tego samego algorytmu.nzajabja
Rozważymy teraz oryginalny problem. Niech będzie zbiorem współrzędnych, które są 0 , a S 1 będzie zbiorem współrzędnych, które są 1 . Następnie
∏ i ∈ S 0 p ( v i = 0 ) ∏ i ∈ S 1 p ( v i = 1 )S.00S.11
∏i ∈ S.0p ( wja= 0 ) ∏i ∈ S.1p ( wja= 1 )==∏1 ≤ i ≤ np ( wja= 0 ) ∏i ∈ S.1p ( wja= 1 )p ( wja= 0 )∏1 ≤ i ≤ np ( wja= 0 ) exp( ∑i ∈ S.1logp ( wja= 1 )p ( wja= 0 )) .
Sortowanie tych liczb jest takie samo jak sortowanie liczb , więc zredukowaliśmy problem do sortowania sum podzbiorów n elementów.∑i ∈ S.1logp ( wja= 1 ) - logp ( wja= 0 )n