A seguir, é apresentado um algoritmo que usa aproximadamente tempo e 2 n / 2 de espaço.2n2n / 2
Primeiro, vejamos o problema de classificar as somas de todos os subconjuntos de itens.n
Considere este subproblema: você tem duas listas classificadas de comprimento e gostaria de criar uma lista classificada das somas aos pares dos números nas listas. Você gostaria de fazer isso em aproximadamente O ( m 2 ) tempo (o tamanho da saída), mas em espaço sublinear. Podemos alcançar O ( m ) espaço. Mantemos uma fila de prioridade e extraímos as somas da fila de prioridade em ordem crescente.mO ( m2)O ( m )
Deixe as listas de ser e b 1 ... b m , classificados em ordem crescente. Tomamos as m somas a i + buma1... amb1... bmm , i = 1 ... m , e colocá-los em uma fila de prioridade.umaEu+ b1i = 1 … m
Agora, quando extraímos a menor soma restante da fila de prioridade, se j < m , então colocamos a soma a i + b j + 1 na fila de prioridade. O espaço é dominado pela fila de prioridade, que contém sempre a maioria m somas. E o tempo é O ( m 2 log m ) , já que usamos O ( log mumaEu+ bjj < mumaEu+ bj + 1mO ( m2registrom ) para cada operação na fila de prioridade. Isso mostra que podemos fazer o subproblema em O ( m 2O ( logm ) tempo e O ( m ) espaço.O ( m2registrom )O ( m )
Agora, para classificar as somas de todos os subconjuntos de números, usamos apenas esta sub-rotina em que a listan é o conjunto de somas de subconjuntos da primeira metade dos itens, ea lista b i é o conjunto de somas de subconjuntos da segunda metade dos itens. Podemos encontrar essas listas recursivamente com o mesmo algoritmo.umaEubEu
Vamos agora considerar o problema original. Seja o conjunto de coordenadas 0 e S 1 o conjunto de coordenadas 1 . Então
Π i ∈ S 0 p ( v i = 0 ) Π i ∈ S 1S0 00 0S11
∏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)).
Classificar esses números é o mesmo que classificar os números , de modo que têm reduzido o problema para classificar os somas de subconjuntos de n itens.∑i∈S1logp(vi=1)−logp(vi=0)n