Lo siguiente proporciona un algoritmo que usa aproximadamente tiempo y espacio.2 n / 22n2n/2
Primero, veamos el problema de ordenar las sumas de todos los subconjuntos de elementos.n
Considere este subproblema: tiene dos listas ordenadas de longitud , y le gustaría crear una lista ordenada de las sumas por pares de los números en las listas. Le gustaría hacer esto en aproximadamente tiempo (el tamaño de salida), pero en un espacio sublineal. Podemos lograr el espacio . Mantenemos una cola de prioridad y sacamos las sumas de la cola de prioridad en orden creciente.O ( m 2 ) O ( m )mO(m2)O(m)
Deje que las listas sean y , ordenadas en orden creciente. Tomamos las sumas , , y las en una cola prioritaria.b 1 ... b m m a i + b 1 i = 1 ... ma1…amb1…bmmai+b1i=1…m
Ahora, cuando sacamos la suma más pequeña restante de la cola de prioridad, si entonces colocamos la suma en la cola de prioridad. El espacio está dominado por la cola de prioridad, que siempre contiene como máximo sumas. Y el tiempo es , ya que usamos para cada operación de cola prioritaria. Esto muestra que podemos hacer el subproblema en el tiempo y el espacio . j < m a i + b j + 1 m O ( m 2 log m ) O ( log m ) O ( m 2 log m ) O ( m )ai+bjj<mai+bj+1mO(m2logm)O(logm)O(m2logm)O(m)
Ahora, para ordenar las sumas de todos los subconjuntos de números, solo usamos esta subrutina donde la lista es el conjunto de sumas de subconjuntos de la primera mitad de los elementos, y la lista es el conjunto de sumas de subconjuntos de segunda mitad de los artículos. Podemos encontrar estas listas de forma recursiva con el mismo algoritmo.a i b inaibi
Ahora consideraremos el problema original. Sea el conjunto de coordenadas que son y el conjunto de coordenadas que son . Entonces
0 S 1 1 ∏ 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)).
Ordenar estos números es lo mismo que ordenar los números , por lo que hemos reducido el problema a ordenar las sumas de subconjuntos de artículos.n∑i∈S1logp(vi=1)−logp(vi=0)n