Di seguito viene fornito un algoritmo che utilizza circa tempo e 2 n / 2 di spazio.2n2n/2
Innanzitutto, esaminiamo il problema dell'ordinamento delle somme di tutti i sottoinsiemi di articoli.n
Considera questo sottoproblema: hai due elenchi ordinati di lunghezza e desideri creare un elenco ordinato delle somme a coppie dei numeri negli elenchi. Ti piacerebbe farlo in circa O ( m 2 ) di tempo (la dimensione di output), ma lo spazio sublineare. Siamo in grado di raggiungere lo spazio O ( m ) . Manteniamo una coda di priorità ed estraiamo le somme dalla coda di priorità in ordine crescente.mO(m2)O(m)
Lasciate che le liste siano e b 1 ... b m , ordinati in ordine crescente. Prendiamo le somme m a i + b 1 , i = 1 … m e le mettiamo in una coda prioritaria.a1…amb1…bmmai+b1i=1…m
Ora, quando estraiamo la somma rimanente più piccola dalla coda di priorità, se j < m inseriamo quindi la somma a i + b j + 1 nella coda di priorità. Lo spazio è dominato dalla coda di priorità, che contiene sempre al massimo m somme. E il tempo è O ( m 2 log m ) , poiché utilizziamo O ( log m ) per ogni operazione di coda prioritaria. Questo dimostra che possiamo fare il sottoproblema in O ( m 2ai+bjj<mai+bj+1mO(m2logm)O(logm) tempo e O ( m ) spazio.O(m2logm)O(m)
Ora, per ordinare le somme di tutti i sottoinsiemi di numeri, utilizziamo semplicemente questa subroutine in cui l'elenco a i è l'insieme di somme di sottoinsiemi della prima metà degli elementi e l'elenco b i è l'insieme di somme di sottoinsiemi della seconda metà degli articoli. Possiamo trovare questi elenchi in modo ricorsivo con lo stesso algoritmo.naibi
Considereremo ora il problema originale. Sia l'insieme di coordinate che sono 0 e S 1 sia l'insieme di coordinate che sono 1 . Quindi
∏ 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)).
L'ordinamento di questi numeri è lo stesso dell'ordinamento dei numeri , quindi abbiamo ridotto il problema all'ordinamento delle somme di sottoinsiemi di n elementi.∑i∈S1logp(vi=1)−logp(vi=0)n