Considérons un vecteur dimensionnel v où v i ∈ { 0 , 1 } . Pour chaque i, nous connaissons p i = P ( v i = 1 ) et supposons que les v i sont indépendants. En utilisant ces probabilités, existe-t-il un moyen efficace d'itérer sur des vecteurs binaires de dimension n dans l'ordre du plus probable au moins probable (avec des choix arbitraires pour les liens) en utilisant l'espace sublinéaire dans la taille de sortie?
Prenons par exemple . Le vecteur le plus probable est ( 1 , 0 , 1 ) et le moins probable est { 0 , 1 , 0 } .
Pour un très petit, nous pourrions étiqueter chacun des 2 n vecteurs avec sa probabilité et simplement trier, mais cela n'utiliserait bien sûr pas encore l'espace sublinéaire.
Une variante proche de cette question a déjà été posée sur /cs/24123/how-to-iterate-over-vectors-in-order-of-probability .
la source
Réponses:
Ce qui suit donne un algorithme qui utilise environ temps et 2 n / 2 espace.2n 2n / 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.m O ( 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… Unm b1… Bm m uneje+ b1 i = 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+ bj j < m ai+bj+1 m O(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.n ai bi
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 )S0 0 S1 1
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
la source
(Nous devons également nous occuper des liens possibles, mais ce n'est pas difficile.)
la source
Modifier: cette réponse est incorrecte. Voir les commentaires pour plus de détails. ~ gandaliter
Appelez cette fonction récursive sur la liste triée et un vecteur vide.
la source