Étant donné un ensemble multiple de nombres naturels X, considérons l'ensemble de toutes les sommes possibles:
Par exemple, tandis que .
Quel est l'algorithme le plus efficace pour calculer l'opération inverse (mesurée en termes de taille de l'ensemble d'entrée de sommes)? Plus précisément, il est possible de calculer efficacement l'un des éléments suivants:
- Si un ensemble donné est un ensemble valide de sommes. (Par exemple, est valide mais ne l'est pas.)
- Un multiset qui résume à l'ensemble donné.
- Le plus petit multiset qui correspond à l'ensemble donné. (Par exemple, et tous les deux à mais le premier est plus petit.)
algorithms
optimization
combinatorics
integers
Uri Granta
la source
la source
Réponses:
Solution
La solution comprend deux parties. Nous découvrons d'abord un ensemble minimal, puis nous prouvons qu'il peut représenter l'ensemble de la puissance. La solution est ajustée pour la mise en œuvre de la programmation.
Algorithme d'ensemble minimal
Trouvez l'élément maximal dans l'ensemble (multi) de somme. P , l'ensemble minimal (multi) potentiel est initialement vide.unem P
À moins qu'il n'y ait qu'un seul groupe, représenter de toutes les manières possibles comme une paire de sommes qui s'additionnent à un m , S i j = { ( a i , a j ) | a i + a j = a m }unem unem Sje j= { ( aje, unj) | uneje+ aj= am}
Vérifiez que tous les éléments de l'ensemble des sommes sont inclus.
Trouver élément maximal de tous les S i j ( ce qui signifie ensemble) avec la propriété suivante: pour chaque S i j , un s est soit en S i j , ou nous pouvons trouver un p de l'ensemble des sommes ainsi que d' un p + a s est dans S i j .unes Sje j Sje j unes Sje j unep unep+ as Sje j
Si tel est le cas que ne contient pas un s , juste la somme d' un s + un p , supprimer un p + a s de S i j (ou tout simplement mettre une marque de l' ignorer) et insérer un p et un s dans S i j à la place.Sje j unes unes+ ap unep+ as Sje j unep unes Sje j
Si un élément est présent dans tous les le retirer de tous les S i j une fois (ou tout simplement mettre une marque de l' ignorer et de ne pas toucher plus longtemps) et l' ajouter à la liste des éléments de l' ensemble minimal potentiel P .Sje j Sje j P
Répétez jusqu'à ce que tous les soient videsSje j
Si une partie de reste non vide et que nous ne pouvons pas continuer, essayez à nouveau avec la valeur maximale de toutes les S i j .Sje j Sje j
Recréer les étapes récursives sans le transfert et continuer avec l' algorithme de couverture du jeu de pouvoir sur . (Avant cela, vous pouvez vérifier que P inclut tous les éléments qui ne peuvent pas être représentés comme une somme de deux éléments, ils doivent donc être dans l'ensemble sous-jacent à coup sûr. Par exemple, l'élément minimal doit être dans P. )P P P
(10. Notez qu'une solution d'ensemble minimale qui est le but de l'algorithme ne peut pas contenir plus d'une répétition du même nombre.)
Exemple:
Représentez 15 de toutes les manières possibles comme une somme de deux nombres de l'ensemble des sommes.
Essayez de trouver le nombre maximal qui est dans tous les groupes ou qui peut être représenté comme une somme. Évidemment, nous pouvons commencer à le rechercher à partir de 8, il est inutile de le dépasser.
13 du premier groupe est 13 = 8 + 5 donc 13 est bien, mais 12 du deuxième groupe n'est pas bien car il n'y a pas de 4 pour faire 12 = 8 + 4 dans l'ensemble des sommes. Ensuite, nous essayons avec 7. Mais immédiatement 13 ne peuvent pas être couverts, il n'y en a pas 6.
Ensuite, nous essayons 5. 13 = 5 + 8, 12 = 5 + 7, 10 = 5 + 5, et pour le dernier soit 8 = 5 + 3 ou 7 = 5 + 2 mais pas les deux. Les groupes sont désormais:
5 se répète dans tous les groupes donc nous l'extrayons . Nous extrayons 5 une seule fois de chaque groupe.P={5}
De toute évidence, il est inutile de dépasser 5, nous essayons donc à nouveau 5. 8 = 5 + 3, 7 = 5 + 2, donc tout va bien
Extrayez à nouveau un 5 de tous les groupes car il se répète. (Ce n'est pas courant mais notre cas est délibérément créé pour afficher ce qu'il faut faire au cas où nous aurions des répétitions.)P={5,5}
Maintenant, nous essayons avec 3 et avons 5 = 3 + 2. Ajoutez-le au groupe.
Maintenant, extrayez 3 et 2 car ils se répètent partout et nous allons bien et les groupes sont vides.P={5,5,3,2}
Maintenant, nous devons recréer des étapes récursives sans suppressions, cela signifie simplement faire ce qui précède sans vraiment supprimer les éléments de simplement en les plaçant dans P et en marquant pour ne plus les modifier.Sij P
( ( 5 , 8 ) , 2 ) , ( ( 5 , 7 ) , 3 ) , ( ( 5 , 5 ) , 5 ) , ( ( 5 , 3 ) , 7
Couverture de l'ensemble d'alimentation
Le but de cette partie est de vérifier si l'ensemble minimal trouvé est capable de couvrir l'ensemble de la somme de puissance. Il est possible qu'une solution trouvée puisse couvrir toutes les sommes données, mais qu'il ne s'agisse pas de sommes définies par la puissance. (Techniquement, vous pouvez simplement créer un ensemble de sommes de puissance à partir de l'ensemble minimal trouvé et vérifier si chaque somme, selon les exigences de l'ensemble de puissances, est dans l'ensemble de sommes initial. C'est tout ce qui vient de fusionner avec ce que nous avons déjà, donc rien n'est gaspillé Vous pouvez faire cette partie en rembobinant la récursivité.)
avec l'encodage: 2 avec 1, 3 avec 2, 5 avec 4 et 5 avec 8. Observez que chaque élément a un encodage différent même s'il est répété.
Si une représentation binaire correspond à la somme introuvable, signalez qu'il n'y a pas de solution.
Discussion
Il était nécessaire de fournir l'algorithme qui va vérifier si les sommes couvrent l'achèvement de l'ensemble de puissance, ce qui est caché dans l'expansion binaire. Par exemple, si nous excluons 8 et 7 de l'exemple initial, la première partie fournirait toujours la solution, seule la deuxième partie rapporterait les combinaisons de sommes manquantes.
Certaines parties de l'algorithme supposent que nous pouvons trouver la paire de sommes en temps linéaire et cela nécessite un tri.
Démarrage incorrect
Le but de cet algorithme est de fournir une solution une fois que nous avons tout démarré correctement.
Améliorations
L'étape 4. est celle qui pourrait être améliorée de cette manière: au lieu de maximale, nous pourrions essayer chaque élément dans l'ordre décroissant qui satisfait la condition donnée. Nous créons une branche distincte pour chacun. Si une branche ne donne pas de solution, annulez-la.
Une autre chose, puisque nous savons que nous ne pouvons pas avoir plus d'une répétition si le cas est minimal, nous pouvons l'incorporer dans notre algorithme.
Dans l'ensemble, la condition à l'étape 4. qu'un nombre doit se répéter dans chaque groupe ou avoir la capacité de créer une somme est assez forte pour nous sortir des eaux exponentielles directes, ce qui serait un algorithme d'essayer simplement chaque combinaison et de créer le pouvoir mis sur chacun jusqu'à ce que nous trouvons une correspondance.
la source
REMARQUE: cela ne fonctionne pas tout à fait en général, voir le contre-exemple d'Uri ci-dessous.
la source