Ce qui suit donne un algorithme qui utilise environ temps et 2 n / 2 espace.2n2n / 2
Examinons d'abord le problème du tri des sommes de tous les sous-ensembles de éléments.n
Considérez ce sous-problème: vous avez deux listes triées de longueur , et vous souhaitez créer une liste triée des sommes par paire des nombres dans les listes. Vous souhaitez le faire dans un temps d'environ O ( m 2 ) (la taille de sortie), mais dans un espace sublinéaire. Nous pouvons atteindre un espace O ( m ) . Nous gardons une file d'attente prioritaire et retirons les sommes de la file d'attente prioritaire dans l'ordre croissant.mO ( m2)O ( m )
Soit les listes et b 1 … b m , triées par ordre croissant. Nous prenons les m sommes a i + b 1 , i = 1 … m , et les mettons dans une file d'attente prioritaire.une1… Unmb1… Bmmuneje+ b1i = 1 … m
Maintenant, lorsque nous tirons la plus petite somme restante de la file d'attente prioritaire, si j < m nous mettons alors la somme a i + b j + 1 dans la file d'attente prioritaire. L'espace est dominé par la file d'attente prioritaire, qui contient toujours au plus m sommes. Et le temps est O ( m 2 log m ) , puisque nous utilisons O ( log m ) pour chaque opération de file d'attente prioritaire. Cela montre que nous pouvons faire le sous-problème en O ( m 2uneje+ bjj < mai+bj+1mO(m2logm)O(logm) temps et O ( m ) espace.O(m2logm)O(m)
Maintenant, pour trier les sommes de tous les sous-ensembles de nombres, nous utilisons simplement ce sous-programme où la liste a i est l'ensemble des sommes des sous-ensembles de la première moitié des éléments, et la liste b i est l'ensemble des sommes des sous-ensembles de la seconde moitié des articles. On peut retrouver ces listes récursivement avec le même algorithme.naibi
Nous allons maintenant considérer le problème d'origine. Soit l'ensemble des coordonnées qui sont 0 et S 1 l'ensemble des coordonnées 1 . Alors
∏ 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)).
Le tri de ces nombres revient à trier les nombres , nous avons donc réduit le problème du tri des sommes des sous-ensembles de n éléments.∑i∈S1logp(vi=1)−logp(vi=0)n