Hier ist ein anderer Ansatz, der darauf basiert, iterativ Zahlen zu finden, die nicht unter . Nennen Sie eine Menge eine Über-Approximation der 's, wenn wir das wissen{a1,…,a6}{a1,…,a6}AAaa{a1,…,a6}⊆A{a1,…,a6}⊆A . In ähnlicher Weise ist ein overapproximation der ‚s , wenn wir wissen , dass . Offensichtlich ist , desto kleiner ist, desto nützlicher diese Über Annäherung ist, und das gleiche gilt für . Mein Ansatz basiert auf der iterativen Verfeinerung dieser Überapproximationen, dh der iterativen Verkleinerung dieser Mengen (da wir immer mehr Werte als unmöglich ausschließen).BBbb{b1,…,b6}⊆B{b1,…,b6}⊆BAABB
Der Kern dieses Ansatzes ist ein Verfahren zur Verfeinerung : Da eine über Annäherung für die ‚s und eine über Annäherung für die ‘ s, findet eine neue über AnnäherungAAaaBBbbA∗A∗ für die ‚s , so dass . Insbesondere normalerweise wird kleiner sein als , so dass dies läßt uns die über Näherung für die Verfeinerung ‚s.aaA∗⊊AA∗⊊AA∗A∗AAaa
Aus Symmetriegründen lässt uns im Wesentlichen der gleiche Trick unsere Überapproximation für die verfeinern : eine Überapproximation vorausgesetztbbAA für die und einer Überapproximation für die wird eine neue Überapproximation erzeugt -Näherung für die 's.aaBBbbB∗B∗bb
Lassen Sie mich also sagen, wie Verfeinerungen vorgenommen werden, und dann werde ich alles zusammensetzen, um einen vollständigen Algorithmus für dieses Problem zu erhalten. Im Folgenden sei die Mehrfachmenge von Differenzen, dh ; wir konzentrieren sich auf eine raffinierte Über Annäherung zu finden , gegeben .DDD={ai−bj:1≤i,j≤6}D={ai−bj:1≤i,j≤6}A∗A∗A,B
Berechnen einer Verfeinerung Betrachten wir einen einzigen Unterschied . Betrachten Sie die Menge . Basierend auf unserem Wissen, dass eine Über-Approximation der , wissen wir, dass mindestens ein Element von ein Element von sein mussd∈Dd+B={d+y:y∈B}Bbd+B{a1,…,a6} . Daher können wir jedes der Elemente in als "Vorschlag" für eine Zahl behandeln, die möglicherweise in . Lassen Sie uns also alle Differenzen und für jede identifizieren, welche Zahlen von "vorgeschlagen" werden .d+BAd∈Dd
Jetzt werde ich feststellen, dass die Zahl während dieses Vorgangs mit Sicherheit mindestens sechsmal vorgeschlagen wird. Warum? Da die Differenz in ist , und wenn wir sie verarbeiten, wird eine der Zahlen, es schlägt vor (da wir , dass garantiert sind , wird sicherlich umfassen ). Ebenso die Differenza1a1−b1Da1b1∈B(a1−b1)+Ba1a1−b2 irgendwo in und es wird veranlasst, dass erneut vorgeschlagen wird. Auf diese Weise sehen wir, dass der korrekte Wert von mindestens sechsmal vorgeschlagen wird. Gleiches gilt für undDa1a1a2a3, und so weiter.
Also sei die Menge von Zahlen , die mindestens sechsmal vorgeschlagen wurden. Dies ist sicher eine Überbewertung der 's, wie aus den obigen Kommentaren hervorgeht.A∗a∗a
Als Optimierung können wir alle Vorschläge herausfiltern, die in sofort vorhanden sind. Mit anderen Worten, wir können die Differenz so behandeln, als würden alle Werte . Dies stellt sicher, dass wir . Wir hoffen, dass genau kleiner ist als ; Keine Garantie, aber wenn alles gut geht, wird es vielleicht sein.Ad(d+B)∩AA∗⊆AA∗A
Zusammengefasst lautet der Algorithmus zur Verfeinerung von zu wie folgt:A,BA∗
Lassen . Dies ist die Vielzahl von Vorschlägen.S=∪d∈D(d+B)∩A
Zählen Sie, wie oft jeder Wert in erscheint . Sei die Menge von Werten, die in mindestens sechsmal vorkommen . (Dies kann effizient implementiert werden, indem zunächst ein Array von 251 erstellt wird, anfangs alle null, und jedes Mal, wenn die Zahl vorgeschlagen wird, erhöhen SieSA∗Sasa[s] , am Ende Sie fegen durch Suche nach Elementen , deren Wert 6 oder größer)a
Eine ähnliche Methode kann erstellt werden, um zu verfeinern undA,BB∗ . Grundsätzlich kehrt man die obigen Dinge um und dreht ein paar Zeichen um: Beispielsweise sieht man anstelle von .d+B−d+A
Wie man eine anfängliche Über-Approximation berechnet. Um unsere anfängliche Über-Approximation zu erhalten, besteht eine Idee darin, (wlog) anzunehmen, dass . Daraus folgt, dass jeder Wert irgendwo zwischen , daher kann die Liste der Differenzen als unsere anfängliche Über-Approximation für das verwendet werdenb1=0aiDDa . Leider gibt uns dies keine sehr nützliche Überapproximation für die .b
Ein besserer Ansatz ist es, zusätzlich den Wert eines der zu erraten . Mit anderen Worten, wir nehmen (wlog) an, dass , und verwenden als unsere anfängliche Über-Approximation der . Dann raten wir, welcher dieser 36 Werte tatsächlich einer der , sagen wir . Das ergibt dann eine Überapproximation für dasab1=0A=Daaa1B=a1−Db . Wir verwenden diese anfängliche Über-Approximation , verfeinern sie dann iterativ bis zur Konvergenz und testen, ob das Ergebnis korrekt ist. Wir wiederholen bis zu 36 Mal mit 36 verschiedenen Annahmen bei (im Durchschnitt sollten 6 Annahmen ausreichen), bis wir eine finden, die funktioniert.A,Ba1
Ein vollständiger Algorithmus. Jetzt können wir einen vollständigen Algorithmus haben, um . Grundsätzlich leiten wir eine anfängliche Über-Approximation für und und verfeinern sie dann iterativ.a1,…,a6,b1,…,b6AB
Errate: Errate für jedes , dass . Mach Folgendes:z∈Da1=z
Anfängliche : Definieren Sie und .A=DB=z−D
Iterative Verfeinerung: Wenden Sie wiederholt Folgendes bis zur Konvergenz an:
- Verfeinern Sie , um eine neue Überapproximation der zu erhalten.A,BB∗b
- Verfeinern eine neue über Annäherung zu bekommen der ‚s.A,B∗A∗a
- Sei und .A:=A∗B:=B∗
Auf Erfolg prüfen : Wenn die resultierenden Mengen jeweils die Größe 6 haben, prüfen Sie, ob sie eine gültige Lösung für das Problem darstellen. Wenn ja, hör auf. Wenn nicht, fahren Sie mit der Schleife über Kandidatenwerte von .A,Bz
Analyse.
Ob das funktioniert? Konvergiert es irgendwann auf und , oder bleibt es , ohne das Problem vollständig zu lösen? Der beste Weg, dies herauszufinden, ist wahrscheinlich, es zu testen. Aber für Ihre Parameter, ja, ich gehe davon aus, dass es effektiv sein wird.A={a1,…,a6}B={b1,…,b6}
Wenn wir Methode # 1 verwenden, solangesind nicht zu groß, heuristisch erwarte ich, dass die größen der sets monoton schrumpfen. Ziehen Sie in Betracht, von abzuleiten . Jeder Unterschied legtWerte; einer von ihnen ist korrekt, und der andere kann (heuristisch) als Zufallszahl behandelt werden. Wenn eine Zahl ist, die nicht unter den , wie groß ist die Wahrscheinlichkeit, dass sie die Filterung überlebt und zu hinzugefügt wird ? Nun ja, wir erwarten vorgeschlagen werden über|A|,|B|A∗A,Bd|B||B|−1xaA∗a(|B|−1)×36/251 (im Durchschnitt mit einer Standardabweichung um die Quadratwurzel davon). Wenn , ist die Wahrscheinlichkeit, dass ein falsches|B|≤36xüberlebt, sollte die Filterung bei etwa (unter Verwendung der normalen Approximation für das Binomial mit Kontinuitätskorrektur). (Die Wahrscheinlichkeit ist kleiner, wenn kleiner ist; z. B. für erwarte ich .) Ich erwarte, dass die Größe von ungefähr , was die Überapproximation streng verbessern wird, da sie streng kleiner alsp=0.4|B||B|=30p≈0.25A∗p(|A|−6)+6|A|. Zum Beispiel, wenn , dann erwarte ich basierend auf diesen Heuristiken|A|=|B|=36|A∗|≈18 , was eine große Verbesserung gegenüber.|A|
Daher gehe ich davon aus, dass die Laufzeit sehr schnell sein wird. Ich erwarte, dass ungefähr 3-5 Iterationen der Verfeinerung für die Konvergenz ausreichen, und ungefähr 6 Vermutungen bei sollten wahrscheinlich ausreichen. Jede Verfeinerungsoperation umfasst möglicherweise einige tausend Speicherlesevorgänge / -schreibvorgänge, und wir tun dies möglicherweise 20 bis 30 Mal. Daher erwarte ich, dass dies für die von Ihnen angegebenen Parameter sehr schnell geht. Die einzige Möglichkeit, dies herauszufinden, besteht darin, es zu versuchen und zu prüfen, ob es gut funktioniert oder nicht.z