Das Folgende gibt einen Algorithmus an, der ungefähr Zeit und 2 n / 2 Raum verwendet.2n2n/2
Betrachten wir zunächst das Problem des Sortierens der Summen aller Teilmengen von Elementen.n
Betrachten Sie dieses Unterproblem: Sie haben zwei sortierte Listen mit der Länge und möchten eine sortierte Liste der paarweisen Summen der Zahlen in den Listen erstellen. Sie möchten dies in ungefähr 0 ( m 2 ) Zeit (der Ausgabegröße), aber im sublinearen Raum tun . Wir können O ( m ) Raum erreichen. Wir führen eine Prioritätswarteschlange und ziehen die Summen in aufsteigender Reihenfolge aus der Prioritätswarteschlange heraus.mO(m2)O(m)
Die Listen seien und b 1 … b m , in aufsteigender Reihenfolge sortiert. Wir nehmen die m Summen a i + b 1 , i = 1 … m und stellen sie in eine Prioritätswarteschlange.a1…amb1…bmmai+b1i=1…m
Wenn wir nun die kleinste verbleibende Summe aus der Prioritätswarteschlange ziehen, setzen wir , wenn j < m , die Summe a i + b j + 1 in die Prioritätswarteschlange. Der Raum wird von der Prioritätswarteschlange dominiert, die immer höchstens m Summen enthält. Und die Zeit ist O ( m 2 log m ) , da wir O ( log m ) für jede Prioritätswarteschlangenoperation verwenden. Dies zeigt, dass wir das Teilproblem in O ( m 2 lösen könnenai+bjj<mai+bj+1mO(m2logm)O(logm) Zeit und O ( m ) Raum.O(m2logm)O(m)
Um nun die Summen aller Teilmengen von Zahlen zu sortieren , verwenden wir einfach diese Unterroutine, bei der die Liste a i die Menge von Teilmengen der ersten Hälfte der Elemente ist und die Liste b i die Menge von Teilmengen ist der zweiten Hälfte der Artikel. Wir können diese Listen mit demselben Algorithmus rekursiv finden.naibi
Wir werden nun das ursprüngliche Problem betrachten. Sei der Satz von Koordinaten, die 0 sind , und S 1 der Satz von Koordinaten, die 1 sind . Dann
∏ 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)).
Das Sortieren dieser Zahlen ist dasselbe wie das Sortieren der Zahlen , daher haben wir das Problem auf das Sortieren der Summen von Teilmengen von n Elementen reduziert .∑i∈S1logp(vi=1)−logp(vi=0)n