Voici une approche différente, basée sur la recherche itérative de nombres qui ne peuvent pas apparaître parmi . Appeler un ensemble une sur-approximation de l' « s si nous savons que . De même, est un surapproximation du « s si nous savons que . , Plus Il est évident est, plus cette approximation est trop utile et va de même pour . Mon approche est basée sur l'affinage itératif de ces sur-approximations, c'est-à-dire sur la réduction itérative de la taille de ces ensembles (car nous excluons de plus en plus de valeurs comme impossibles).A a { a 1 , … , a 6 } ⊆ A B b { b 1 , … , b 6 } ⊆ B A B{a1,…,a6}Aa{a1,…,a6}⊆ABb{b1,…,b6}⊆BAB
Le cœur de cette approche est une méthode de raffinement : étant donné une sur-approximation pour les et une sur-approximation pour les , trouver une nouvelle sur-approximation pour les telle que . En particulier, normalement sera plus petite que , donc cela nous permet d' affiner la plus-approximation pour les s ».a B b A ∗ a A ∗ ⊊ A A ∗ A aAaBbA∗aA∗⊊AA∗Aa
Par symétrie, essentiellement la même astuce nous permettra d'affiner notre sur-approximation pour les : étant donné une sur-approximation pour les et une sur-approximation pour les , elle produira un nouveau sur -approximation pour les .A a B b B ∗ bbAaBbB∗b
Alors, laissez-moi vous dire comment raffiner, puis je vais tout mettre ensemble pour obtenir un algorithme complet pour ce problème. Dans ce qui suit, considérons le multi-ensemble de différences, c'est-à-dire ; nous allons nous concentrer sur la recherche d' un cadre raffiné sur-approximation , donnée .D = { a i - b j : 1 ≤ i , j ≤ 6 } A ∗ A , BDD={ai−bj:1≤i,j≤6}A∗A,B
Comment calculer un raffinement. Considérons une seule différence . Considérons l'ensemble . Sur la base de notre connaissance que est une sur-approximation des , nous savons qu'au moins un élément de doit être un élément de . , On peut donc traiter chacun des éléments comme une « suggestion » pour un certain nombre d'inclure éventuellement dans . Donc, balayons toutes les différences et, pour chacune, identifions les nombres qui sont "suggérés" par .d + B = { d + y : y ∈ B } B b d + B { a 1 , … , a 6 } d + B A d ∈ D dd∈Dd+B={d+y:y∈B}Bbd+B{a1,…,a6}d+BAd∈Dd
Maintenant, je vais observer que le nombre est sûr d'être suggéré au moins 6 fois au cours de ce processus. Pourquoi? Parce que la différence est en , et quand nous la traitons, sera l'un des nombres qu'elle suggère (puisque nous sommes garantis que , inclura sûrement ). De même, la différence apparaît quelque part dans , et cela entraînera une nouvelle suggestion de . De cette façon, nous voyons que la valeur correcte de sera suggérée au moins 6 fois. Il en va de même pour eta 1 - b 1 D a 1 b 1 ∈ B ( a 1 - b 1 ) + B a 1 a 1 - b 2 D a 1 a 1 a 2 a 3a1a1−b1Da1b1∈B(a1−b1)+Ba1a1−b2Da1a1a2a3, etc.
Soit donc l'ensemble des nombres qui ont été suggérés au moins 6 fois. C'est certainement une sur-approximation des , par les commentaires ci-dessus.a ∗ aA∗a∗a
À titre d'optimisation, nous pouvons filtrer toutes les suggestions qui ne sont pas présents dans tout de suite: en d' autres termes, nous pouvons traiter la différence comme suggérant toutes les valeurs . Cela garantit que nous aurons . Nous espérons que est strictement inférieur à ; aucune garantie, mais si tout se passe bien, ce sera peut-être le cas.d ( d + B ) ∩ A A ∗ ⊆ A A ∗ AAd(d+B)∩AA∗⊆AA∗A
Ensemble, l'algorithme pour affiner pour produire est le suivant:A ∗A,BA∗
Soit . Ceci est le multi-ensemble de suggestions.S=∪d∈D(d+B)∩A
Comptez combien de fois chaque valeur apparaît dans . Que l'ensemble des valeurs qui apparaissent au moins 6 fois dans . (Cela peut être mis en œuvre efficacement en construisant un tableau de 251 initialement, initialement tout à zéro, et chaque fois que le nombre est suggéré, vous incrémentez ; à la fin, vous balayez à recherche d'éléments dont la valeur est 6 ou plus grande)A ∗ S a s a [ s ] aSA∗Sasa[s]a
Une méthode similaire peut être construite pour affiner pour obtenir . Vous choses fondamentalement inverse ci - dessus et retourner quelques signes: par exemple, au lieu de , vous regardez .B ∗ d + B - d + AA,BB∗d+B−d+A
Comment calculer une sur-approximation initiale. Pour obtenir notre sur-approximation initiale, une idée est de supposer (wlog) que . Il s'ensuit que chaque valeur doit apparaître quelque part parmi , ainsi la liste des différences peut être utilisée comme notre sur-approximation initiale pour les . Malheureusement, cela ne nous donne pas une sur-approximation très utile pour les .a i D D a bb1=0aiDDab
Une meilleure approche consiste à deviner en outre la valeur de l' des a. En d' autres termes, nous supposons (wlog) que , et utiliser comme notre plus-approximation des s ». Ensuite, nous devinons laquelle de ces 36 valeurs est en effet l' des a, disons . Cela nous donne alors une sur-approximation pour les . Nous utilisons cette sur-approximation initiale , puis l'affinons itérativement jusqu'à la convergence, et testons si le résultat est correct. Nous répétons jusqu'à 36 fois, avec 36 suppositions différentes à (en moyenne 6 suppositions devraient suffire) jusqu'à ce que nous trouvions celle qui fonctionne.b 1 = 0 A = D a a a 1 B = a 1 - D b A , B a 1ab1=0A=Daaa1B=a1−DbA,Ba1
Un algorithme complet. Maintenant, nous pouvons avoir un algorithme complet pour calculer . Fondamentalement, nous dérivons une sur-approximation initiale pour et , puis affinons itérativement. A Ba1,…,a6,b1,…,b6AB
Faites une supposition: pour chaque , devinez que . Procédez comme suit:a 1 = zz∈Da1=z
Sur-approximation initiale: Définissez et .B = z - DA=DB=z−D
Raffinement itératif: appliquer à plusieurs reprises ce qui suit jusqu'à la convergence:
- Affinez pour obtenir une nouvelle sur-approximation des .B ∗ bA,BB∗b
- Affinez pour obtenir une nouvelle sur-approximation des .A ∗ aA,B∗A∗a
- Soit et . B : = B ∗A:=A∗B:=B∗
Vérifier le succès: si les ensembles résultants ont chacun une taille 6, testez s'ils sont une solution valide au problème. S'ils le sont, arrêtez. Sinon, continuez avec la boucle sur les valeurs candidates de .zA,Bz
Une analyse.
Est-ce que ça va marcher? Va-t-il éventuellement converger vers et , ou restera-t-il bloqué sans résoudre complètement le problème? La meilleure façon de le savoir est probablement de le tester. Cependant, pour vos paramètres, oui, je m'attends à ce que ce soit efficace.A={a1,…,a6}B={b1,…,b6}
Si nous utilisons la méthode # 1, tant quene sont pas trop grandes, heuristiquement je m'attends à ce que la taille des ensembles diminue de façon monotone. Pensez à tirer de . Chaque différence suggèrevaleurs; l'un d'eux est correct, et l'autre peut être traité (heuristiquement) comme des nombres aléatoires. Si est un nombre qui n'apparaît pas parmi les , quelle est la probabilité qu'il survive au filtrage et soit ajouté à ? Eh bien, nous nous attendons à ce soit suggéré à propos de|A|,|B|A∗A,Bd|B||B|−1xaA∗a(|B|−1)×36/251fois au total (en moyenne, avec un écart-type autour de la racine carrée de cela). Si , la probabilité qu'un mauvais survit au filtrage devrait être d'environ environ (en utilisant l'approximation normale pour le binôme, avec correction de continuité). (La probabilité est plus petite si est plus petite; par exemple, pour , je m'attends à .) Je m'attends à ce que la taille de soit d'environ , ce qui améliorera strictement la sur-approximation car elle est strictement inférieure à. Par exemple, si , alors sur la base de ces heuristiques, je m'attends|B|≤36xp=0.4|B||B|=30p≈0.25A∗| A | | A | = | B | = 36 | A ∗ | ≈ 18 | A |p(|A|−6)+6|A||A|=|B|=36|A∗|≈18 , ce qui représente une nette amélioration par rapport à.|A|
Par conséquent, je prédis que le temps d'exécution sera très rapide. Je m'attends à ce que 3 à 5 itérations de raffinement suffisent pour la convergence, en général, et environ 6 suppositions à devraient probablement suffire. Chaque opération de raffinement implique peut-être quelques milliers de lectures / écritures en mémoire, et nous le faisons peut-être 20 à 30 fois. Donc, je m'attends à ce que ce soit très rapide, pour les paramètres que vous avez spécifiés. Cependant, la seule façon de savoir avec certitude est de l'essayer et de voir si cela fonctionne bien ou non.z